﻿using System;
using System.Collections.Generic;

namespace DoNet.SFExpress.Framework.FOP_RECE
{
    /// <summary>
    /// 快运API
    /// </summary>
    public class FopReceApi
    {
        #region 零担下单类

        /// <summary>
        /// 下快运订单-快运
        /// 注意：该接口用于大件特殊场景下单，无特殊场景请使用通用寄件下单接口
        /// 下单接口根据客户需要，可以提供以下功能：
        /// 客户系统向顺丰下发订单
        /// 为订单分配运单号和签回单号
        /// 提供面单打印的信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult LtlCreateOrder(string partnerID, string checkword, MsgDataRequestLtlCreateOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            请求示例(msgData部分数据）

            {
                "AdditionServices": [
                    {
                        "name": "INSURE",
                        "value": "4"
                    }
                ],
                "cargoList": [
                    {
                        "boxNo": "商品下发3",
                        "count": 1,
                        "height": 6,
                        "length": 4,
                        "name": "商品下发3",
                        "volume": 230000.0,
                        "weight": 26,
                        "width": 5
                    },
                    {
                        "boxNo": "商品下发3",
                        "count": 1,
                        "height": 103,
                        "length": 100,
                        "name": "商品下发3",
                        "volume": 103000.0,
                        "weight": 0,
                        "width": 1024
                    }
                ],
                "cargoName": "商品下发3 （1件） 商品下发1 （1件）",
                "cargoTotalWeight": 126.0,
                "cargoTypeCode": "SP635",
                "customId": "7556000455",
                "declaredValue": 4,
                "deliveryAddress": "粤海街道软件产业基地",
                "deliveryCity": "深圳市",
                "deliveryCompany": "深圳市顺丰供应链有限公司旗下分公司快运科技有限公司",
                "deliveryContact": "彭伟",
                "deliveryCounty": "南山区",
                "deliveryMobile": "18025383086",
                "deliveryProvince": "广东省",
                "deliveryTel": "",
                "expectedPickUpTime": "",
                "isGenBillNo": 0,
                "isReturnSignBackRoutelabel": 0,
                "orderId": "EP11075794533173121",
                "packageList": [
                    {
                        "boxNo": "商品下发3",
                        "height": 6,
                        "length": 4,
                        "unitVolume": "立方厘米",
                        "unitWeight": "千克",
                        "volume": 230000.0,
                        "waybillNo": "SF1030346019019",
                        "weight": 26,
                        "width": 5
                    },
                    {
                        "boxNo": "商品下发3",
                        "height": 103,
                        "length": 100,
                        "unitVolume": "立方厘米",
                        "unitWeight": "千克",
                        "volume": 103000.0,
                        "waybillNo": "SF2070014483968",
                        "weight": 0,
                        "width": 1024
                    }
                ],
                "parcelQuantity": 2,
                "payMethod": 1,
                "paymentType": 2,
                "remark": "",
                "sendAddress": "翠竹南路5412号",
                "sendCity": "深圳市",
                "sendCompany": "",
                "sendContact": "谢玉",
                "sendCounty": "罗湖区",
                "sendMobile": "15012794320",
                "sendProvince": "广东省",
                "sendTel": "",
                "subWaybills": "SF2070014483968",
                "volume": 350000.0,
                "waybillNo": "SF1030346019019"
            }

            响应参数

            属性名	参数类型	Required/Optional	描述
            orderId	String(64)	R	客户订单号
            waybillNo	String(32)	R	顺丰运单号(母单号)。一个订单只能生成一个母单号。
            subWaybillNos	String(400)	O	子单号，如果有多个子单号会以半角逗号分隔。如“755123456789,001123456789”
            returnTrackingNo	String(30)	O	签回单号
            destCode	String(10)	O	目的地区域代码
            filterResult	Number(1)	O	筛单结果： 1：人工确认,客服会在1小时内给下单手机致电反馈是否可达； 2：可收派 3：不可以收派
            filterRemark	String(100)	O	不可以收派的原因代码: 1：收方超范围 2：派方超范围 3：其它原因
            mappingMark	String(30)	O	地址映射码
            paymentLink	String(200)	O	第三方支付运费的URL
            rlsInfo	RlsInfo	O	路由标签信息，用于打印电子面单。参见RlsInfo
            RlsInfo：

            属性名	参数类型	描述
            invokeResult	String(30)	返回调用结果，ERR：调用失败；OK调用成功
            rlsCode	String(30)	调用Rls的错误代码 0000（接口参数异常） 0010（其它异常） 0001（xml解析异常 0002（字段校验异常） 0003（票数节点超出最大值，批量请求最大票数为100票） 0004（RLS获取路由标签的必要字段为空 1000 成功
            errorDesc	String(1000)	错误信息
            rlsDetail	RlsDetail	路由标签查询结果详情
            RlsDetail：

            属性名	参数类型	描述
            waybillNo	String(64)	运单号
            sourceTransferCode	String(60)	原寄地中转场
            sourceCityCode	String(60)	原寄地城市代码
            sourceDeptCode	String(60)	原寄地网点代码
            sourceTeamCode	String(60)	原寄地单元区域
            destCityCode	String(60)	目的地城市代码,eg:755
            destDeptCode	String(60)	目的地网点代码,eg:755AQ
            destDeptCodeMapping	String(60)	目的地网点代码映射码
            destTeamCode	String(60)	目的地单元区域,eg:001
            destTeamCodeMapping	String(60)	目的地单元区域映射码
            destTransferCode	String(60)	目的地中转场
            destRouteLabel	String(200)	打单时的路由标签信息
            proName	String(60)	产品名称 对应RLS:pro_name
            cargoTypeCode	String(30)	快件内容： 如：C816、SP601
            limitTypeCode	String(30)	时效代码, 如：T4
            expressTypeCode	String(30)	产品类型,如：B1
            codingMapping	String(60)	入港映射码 eg:S10
            codingMappingOut	String(60)	出港映射码
            forwardFlag	String(30)	外发标签
            printFlag	String(60)	打印标志 返回值总共有 9 位，每一位只有 0和 1 两种， 0 表示按顺丰运单默认的规则，1 表示显示
            twoDimensionCode	String(600)	二维码
            printIcon	String(100)	打印图标 根据托寄物判断需要打印的图标 (重货,蟹类,生鲜,易碎，Z 标)返回值有 8 位，每一位只有 0 和 1两种，0 表示按运单默认的规则，1 表示显示。后面两位默认 0 备用。 顺序如下：重货,蟹类,生鲜,易碎, 医药类,Z 标,0,0 如：00000000 表示不需要打印重货，蟹类，生鲜，易碎,医药,Z 标,备用,备用
            fopIcon	String(100)	快运标签：目前有两位，第一位备用。第二位：送装标识（0:不打印;1:送装分离icon;2:送装一体icon）
            abFlag	String(30)	AB标
            errMsg	String(1000)	查询出现异常时返回信息。 返回代码： 0 系统异常 1 未找到运单
            goodsNumber	String(20)	件数
            pickUpWay	String(50)	提/送货方式: 自提 送货上门（无电梯） 送货上门（有电梯） 送货（不含上楼）
            routeArray	String(100)	路由数组,示例:”755G:D3,769BG:A2,020BF:C2,021BG:AF,010FG:D2”
            printLogo	Number(1)	是否打印logo 1：打印 其他：不打印
            响应示例

            {
                "obj": {
                    "destCode": "755A",
                    "filterResult": "2",
                    "orderId": "1638431361",
                    "remark": "IN100:加价管控，IN100深圳——深圳",
                    "returnTrackingNo": "SF1200020923891",
                    "rlsInfo": {
                        "rlsDetail": {
                            "abFlag": "",
                            "cargoTypeCode": "SP647",
                            "codingMapping": "D16",
                            "codingMappingOut": "A01",
                            "destCityCode": "755",
                            "destDeptCode": "755A",
                            "destDeptCodeMapping": "755W",
                            "destRouteLabel": "755W_CITY_DD-A-018",
                            "destTeamCode": "018",
                            "destTeamCodeMapping": "",
                            "destTransferCode": "755W_CITY_DD",
                            "destinationStationCode": "",
                            "errMsg": "",
                            "expressTypeCode": "B2",
                            "fopIcon": "00",
                            "goodsNumber": "",
                            "limitTypeCode": "T28",
                            "newIcon": "00000100",
                            "printFlag": "000000000",
                            "printIcon": "00110000",
                            "proCode": "T4",
                            "proName": "",
                            "routeArray": "'755AWQ':'A01','':'','':'','755W_CITY_DD':'D16'",
                            "sendAreaCode": "",
                            "sourceCityCode": "755",
                            "sourceDeptCode": "755Q",
                            "sourceTeamCode": "005",
                            "sourceTransferCode": "755AWQ",
                            "sxCompany": "",
                            "twoDimensionCode": "MMM={'k1':'755W_CITY_DD','k2':'755A','k3':'018','k4':'T4','k5':'SF1030368080027','k6':'','k7':'cadc763c'}",
                            "waybillNo": "SF1030368080027",
                            "xbFlag": "0"
                        }
                    },
                    "signBackRlsInfo": {
                        "rlsDetail": {
                            "abFlag": "",
                            "cargoTypeCode": "C201",
                            "codingMapping": "",
                            "codingMappingOut": "A01",
                            "destCityCode": "755",
                            "destDeptCode": "755",
                            "destDeptCodeMapping": "",
                            "destRouteLabel": "755W_CITY_DD-755",
                            "destTeamCode": "",
                            "destTeamCodeMapping": "",
                            "destTransferCode": "755W_CITY_DD",
                            "destinationStationCode": "",
                            "errMsg": "",
                            "expressTypeCode": "B1",
                            "goodsNumber": "",
                            "limitTypeCode": "T4",
                            "newIcon": "00000000",
                            "printFlag": "000000000",
                            "printIcon": "00000000",
                            "proCode": "T4",
                            "proName": "顺丰特快",
                            "routeArray": "'755W_CITY_DD':'A01','':'','':'','755W_CITY_DD':''",
                            "sendAreaCode": "",
                            "sourceCityCode": "755",
                            "sourceDeptCode": "755U",
                            "sourceTeamCode": "027",
                            "sourceTransferCode": "755W_CITY_DD",
                            "sxCompany": "",
                            "twoDimensionCode": "MMM={'k1':'755W_CITY_DD','k2':'755','k3':'','k4':'T4','k5':'SF1200020923891','k6':'','k7':'bdf95b16'}",
                            "waybillNo": "SF1200020923891",
                            "xbFlag": "0"
                        }
                    },
                    "subWaybillNos": "SF2060036457654,SF2010285271160,SF2010285270703",
                    "waybillNo": "SF1030368080027"
                },
                "success": true
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_LTL_CREATE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseLtlCreateOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 取消订单
        /// 该接口用于在揽收前取消订单。
        /// 注意： 已揽收的订单，不支持取消
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult LtlCancelOrder(string partnerID, string checkword, MsgDataRequestLtlCancelOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求示例(msgData部分数据）

            {
                "orderId":"EP12343432232"
            }
            2.3.返回参数
            属性名	参数类型	Required/Optional	描述
            orderId	String(64)	R	客户订单号
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            obj	Object	O	返回数据
            响应示例

            {
                "errorCode": "",
                "errorMessage": "",
                "success": true
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_LTL_CANCEL_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseLtlCancelOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 下单结果查询
        /// 对于下call的接入订单，如需接收分配的小哥及小哥上门动态信息，可以通过对接此接口获得最新信息。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult LtlGetOrderResult(string partnerID, string checkword, MsgDataRequestLtlGetOrderResult data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求示例(msgData部分数据）

            {
                "orderId":"EP123442131212"
            }
            2.2.响应参数

            参考接口(下快运订单)的响应参数

            响应示例

            参考接口(下快运订单)的响应示例 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_LTL_GET_ORDER_RESULT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseLtlGetOrderResult>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 追加子单号
        /// 本接口用于快运订单，解决大客户发货不确定包裹数量，打包后追加子单，并打印的场景。一个订单最多追加1200个子单号。
        /// （1）仅限追加自己订单，仅限揽件前追加子单。
        /// （2）针对已打印面单的订单，请在追加后重新打印贴单，以免影响货物中转，造成损失。
        /// （3）追加后将修改订单件数信息。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult LtlAppendSubWaybill(string partnerID, string checkword, MsgDataRequestLtlAppendSubWaybill data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求示例(msgData部分数据）

            {
                "orderId":"EP123442131212",
                "count": 10
            }

            2.2.响应参数
            参考接口(下快运订单)的响应参数

            响应示例

            参考接口(下快运订单)的响应示例 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_LTL_APPEND_SUB_WAYBILL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseLtlAppendSubWaybill>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 零担下单类

        #region 运单查询推送类

        /// <summary>
        /// 订单状态推送
        /// （运单查询推送类—订单状态推送）对于下call的接入订单，如需接收分配的小哥及小哥上门动态信息，可以通过对接此接口获得最新信息。
        /// （整车直达类—订单状态推送）此接口推送订单状态，如对接方需要跟踪订单状态（已接收，已取消等），可以对接此接口。
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponseLtlOrderStatus LtlOrderStatus(string body, out MsgDataRequestLtlOrderStatus msgData)
        {
            string errorCode = "";
            string errorMessage = "";
            bool success = false;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<LtlOrderStatusRequest>(body);
                if (reqData != null)
                {
                    msgData = reqData.msgData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new MsgDataResponseLtlOrderStatus()
            {
                errorCode = errorCode,
                errorMessage = errorMessage,
                success = success
            };
        }

        /// <summary>
        /// 运单图片查询
        /// 本接口用于查询运单签收等图片信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QueryPic(string partnerID, string checkword, MsgDataRequestQueryPic data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求示例(msgData部分数据）

            {
                    "waybillNo": "SF1336340026280",
                    "imageTypes": [
                        "71"
                    ],
                    "monthlyCard": "0200217018"
                }

            2.3.响应参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            obj	Obj	O	业务对象
            业务对象：

            属性名	参数类型	Required/Optional	描述
            picInfoList	Array	R	图片信息列表，详情见ImageVo
            ImageVo:

            属性名	参数类型	Required/Optional	描述
            imageType	String	R	图片类型
            amount	Integer	R	图片数量
            imageList	Array(String)	R	图片集，内容为图片base64编码
            响应示例

            {
                "success":true,
                "obj":{
                    "picInfoList": [
                        {
                            "imageType": "71",
                            "amount": 1,
                            "imageList": [
                                "ifenfeihwiKHeog3..."
                            ]
                        }
                    ]
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_QUERY_PIC";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseQueryPic>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 图片注册推送
        /// 使用图片推送服务时，需通过此接口注册运单，并配置回调之后，方可接收到推送信息。
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponseLtlRegisterPic LtlRegisterPic(string body, out MsgDataRequestLtlRegisterPic msgData)
        {
            /*
            请求示例(msgData部分数据）

            {
                "orderId": "1631013393",
                "waybillNo": "SF1030355083520",
                "imageTypes": [
                    "68"
                ]
            }
            2.3.响应参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            响应参数示例：

            {
                "success": true
            } 
            */
            string errorCode = "";
            string errorMessage = "";
            bool success = false;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<LtlRegisterPicRequest>(body);
                if (reqData != null)
                {
                    msgData = reqData.msgData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new MsgDataResponseLtlRegisterPic()
            {
                errorCode = errorCode,
                errorMessage = errorMessage,
                success = success
            };
        }

        /// <summary>
        /// 图片推送
        /// 图片推送服务为顺丰快运向外主动推送图片信息
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponseLtlImage LtlImage(string body, out MsgDataRequestLtlImage msgData)
        {
            /*
            请求示例(msgData部分数据）

            {
                "imageInfoList": [{
                    "amount": 3,
                    "imageType": "68",
                    "imageUrlInfoList": [{
                        "fileName": "SF1030355083520_21090719463967868.png",
                        "token": "AUTH_tkv12_c7adb0361b93f1b706aa01b129e912fe4e8fca1cf47c5e7d6664ab1b9d1fbb95f76847fb6f267889389539774af3ed4d6b12325c9cd2e766c71bf0fd852d3372a80e49225354fdc517e7b7d09119e7f04aed384d860fefffb39945e5428d2fdd6e73a7554232bcd464ffa25e5594b233685f3e77ce5c3aadc90202126bc7d274385854593beded69a063922afd26036b",
                        "url": "http://sit-fop-chan-api-shenzhen-xili1.osssit.sfcloud.local:8080/v1.2/AUTH_sit-FOP-CHAN-API/IMAGE_PUSH/SF1030355083520_21090719463967868.png",
                        "urlExpires": "1631101599746"
                    }, {
                        "fileName": "SF1030355083520_21090719463974668.png",
                        "token": "AUTH_tkv12_c7adb0361b93f1b706aa01b129e912fe4e8fca1cf47c5e7d6664ab1b9d1fbb95f76847fb6f267889389539774af3ed4d6b12325c9cd2e766c71bf0fd852d3372a80e49225354fdc517e7b7d09119e7f04aed384d860fefffb39945e5428d2fdd6e73a7554232bcd464ffa25e5594b2338c8f145564488616baebbc9678fe3a941fed05eb682c1ca52cb2d8d4bfca5375",
                        "url": "http://sit-fop-chan-api-shenzhen-xili1.osssit.sfcloud.local:8080/v1.2/AUTH_sit-FOP-CHAN-API/IMAGE_PUSH/SF1030355083520_21090719463974668.png",
                        "urlExpires": "1631101599815"
                    }, {
                        "fileName": "SF1030355083520_21090719463981568.png",
                        "token": "AUTH_tkv12_c7adb0361b93f1b706aa01b129e912fe4e8fca1cf47c5e7d6664ab1b9d1fbb95f76847fb6f267889389539774af3ed4d6b12325c9cd2e766c71bf0fd852d3372a80e49225354fdc517e7b7d09119e7f04aed384d860fefffb39945e5428d2fdd6e73a7554232bcd464ffa25e5594b2339368153403759f76d9fe8321896af0c9d58e91c52048334c2bb8fbc9285b2104",
                        "url": "http://sit-fop-chan-api-shenzhen-xili1.osssit.sfcloud.local:8080/v1.2/AUTH_sit-FOP-CHAN-API/IMAGE_PUSH/SF1030355083520_21090719463981568.png",
                        "urlExpires": "1631101599870"
                    }]
                }],
                "orderId": "1631013393",
                "waybillNo": "SF1030355083520"
            }
            顺丰外网图片获取：

            GET请求访问url，且header头加X-Auth-token参数，值为token

            2.3. 响应参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	CP接收数据是否成功
            响应示例

            {
                "success": true
            } 
            */
            string errorCode = "";
            string errorMessage = "";
            bool success = false;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<LtlImageRequest>(body);
                if (reqData != null)
                {
                    msgData = reqData.msgData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new MsgDataResponseLtlImage()
            {
                errorCode = errorCode,
                errorMessage = errorMessage,
                success = success
            };
        }

        /// <summary>
        /// 路由查询
        /// 此接口不单独开放，需同时接入零担下单接口使用，用于查询顺丰运单路由，仅支持通过API接口直接下单的运单轨迹查询。
        /// 开放平台会验证接入编码与所有请求运单号的归属关系，系统只返回具有正确归属关系的运单路由信息。
        /// 支持的查询方式：1.根据订单号查询。2.根据运单号查询。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult LtlSearchRouter(string partnerID, string checkword, MsgDataRequestLtlSearchRouter data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求示例(msgData部分数据）

            {
                "checkPhoneNo": "",
                "methodType": 1,
                "trackingNumber": "SF1324403377261, LIS_21080500001QWhna, LIS_21080500001QWhnzf",
                "trackingType": 1
            }
            2.3.响应参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            obj	Obj	O	业务对象
            业务对象

            属性名	参数类型	Required/Optional	描述
            waybillNo	String(30)	Y	运单号
            orderId	String(64)	O	订单号
            routeList	Array	O	路由信息Route的集合
            Route

            属性名	参数类型	Required/Optional	描述
            acceptTime	String(19)	R	路由节点发生的时间，格式：YYYY-MM-DD HH24:MM:SS，示例：2012-07-30 09:30:00。
            acceptAddress	String(100)	R	路由节点发生的地点
            remark	String(150)	R	路由节点具体描述
            opcode	String(20)	R	路由节点操作码
            响应示例

            {
                "obj": [
                    {
                        "mailNo": "SF1324403377261",
                        "routeList": [
                            {
                                "acceptAddress": "深圳市",
                                "acceptTime": "2021-10-28 16:46:19",
                                "opCode": "50",
                                "remark": "顺丰速运 已收取快件"
                            },
                            {
                                "acceptAddress": "深圳市",
                                "acceptTime": "2021-10-28 16:47:02",
                                "opCode": "99",
                                "remark": "应客户要求,快件正在退回中"
                            },
                            {
                                "acceptAddress": "深圳市",
                                "acceptTime": "2021-10-28 16:50:58",
                                "opCode": "99",
                                "remark": "应客户要求,快件正在转寄中"
                            }
                        ]
                    }
                ],
                "success": true
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_LTL_SEARCH_ROUTER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseLtlSearchRouter>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 路由推送 FOP_PUSH_LTL_ROUTER FOP_RECE_TL_SEARCH_ORDER
        /// 该接口用于对外路由推送。
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponseLtlRouter LtlRouter(string body, out MsgDataRequestLtlRouter msgData)
        {
            /*
            请求示例

            {
                "acceptCity": "深圳市",
                "acceptTime": "2019-09-27 17:10:22",
                "opCode": "50",
                "orderId": "817674447",
                "remark": "顺丰速运 已收取快件",
                "waybillNo": "SF1011330100358",
                "uniqueId":"-16516277750"
            }
            2.3. 返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	CP接收数据是否成功
            响应示例

            {
                "success": true
            }
            */
            string errorCode = "";
            string errorMessage = "";
            bool success = false;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<LtlRouterRequest>(body);
                if (reqData != null)
                {
                    msgData = reqData.msgData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new MsgDataResponseLtlRouter()
            {
                errorCode = errorCode,
                errorMessage = errorMessage,
                success = success
            };
        }

        /// <summary>
        /// 清单费用推送 FOP_PUSH_LTL_FEE
        /// 该接口用于对外发货费用清单推送。
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponseLtlFee LtlFee(string body, out MsgDataRequestLtlFee msgData)
        {
            /*
            2.3. 返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	CP接收数据是否成功
            请求示例

            {
                "waybillNo": "444069129271",
                "customerAcctCode": "9999999999",
                "childNos": "002803693071,002803693099,002803693080",
                "orderNo": "1dc300ee-d5bb-465f-86ed-f3f82a326153",
                "meterageWeightQty": 12.5,
                "realWeightQty":6.8,
                "totalFee":14.2,
                "volume": 0,
                "quantity": 4,
                "feeList": [
                    {
                        "bizOwnerZoneCode": "755A",
                        "currencyCode": "CNY",
                        "customerAcctCode": "9999999999",
                        "feeAmt": 1,
                        "feeAmtInd": 1,
                        "feeIndType": 0,
                        "feeTypeCode": "3",
                        "gatherEmpCode": "000212",
                        "gatherZoneCode": "755A",
                        "paymentChangeTypeCode": "0",
                        "paymentTypeCode": "1",
                        "serviceId": -1,
                        "settlementTypeCode": "2",
                        "versionNo": 0,
                        "waybillId": -1,
                        "waybillNo": "444069129271"
                    },
                    {
                        "bizOwnerZoneCode": "755A",
                        "currencyCode": "CNY",
                        "customerAcctCode": "9999999999",
                        "feeAmt": 13.2,
                        "feeAmtInd": 13.2,
                        "feeIndType": 0,
                        "feeTypeCode": "1",
                        "gatherEmpCode": "000212",
                        "gatherZoneCode": "755A",
                        "inputTm": 1545203801000,
                        "paymentChangeTypeCode": "0",
                        "paymentTypeCode": "1",
                        "settlementTypeCode": "2",
                        "versionNo": 0,
                        "waybillId": -1,
                        "waybillNo": "444069129271"
                    }
                ],
                "productName": "标准快递"
            }
            响应示例

            {
                "success": true
            }
            */
            string errorCode = "";
            string errorMessage = "";
            bool success = false;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<LtlFeeRequest>(body);
                if (reqData != null)
                {
                    msgData = reqData.msgData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new MsgDataResponseLtlFee()
            {
                errorCode = errorCode,
                errorMessage = errorMessage,
                success = success
            };
        }

        /// <summary>
        /// 清单费用查询
        /// 客户可通过此接口查询顺丰清单费用收费信息，查询结果仅供参考，实际费用请以月结账单为准。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="accessToken"></param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult LtlQueryFee(string partnerID, string checkword, MsgDataRequestLtlQueryFee data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求示例

            {
                "orderId":"EP1233232323242"
            }
            2.3. 响应参数
            参考接口(清单费用推送)的响应参数

            响应示例

            参考接口(清单费用推送)的响应示例 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_LTL_QUERY_FEE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseLtlQueryFee>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 运单查询推送类

        #region 业务查询类

        /// <summary>
        /// 订单筛单接口
        /// 客户系统通过此接口向顺丰系统发送主动的筛单请求,用于判断客户的收、派地址是否属于顺丰的收派范围。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="accessToken"></param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult AddressReachableCheck(string partnerID, string checkword, MsgDataRequestAddressReachableCheck data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求示例

            {
                    "province": "新疆维吾尔自治区",
                    "city": "乌鲁木齐市",
                    "district": "乌鲁木齐县",
                    "address": "南河路南十五巷",
                    "addressType": "1"

            }
            2.3.响应参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            obj	Obj	O	业务对象
            业务对象

            属性名	参数类型	R/O	描述
            reachable	Int(1)	R	1 可达;2 不可达;3 无法推断
            resultMsg	String（32）	O	结果信息
            响应示例

            {
                "apiErrorMsg":"",
                "apiResponseID":"0001927FAA610A3FE18641C02A38413F",
                "apiResultCode":"A1000",
                "apiResultData":"{\"obj\":{\"reachable\":3,\"resultMsg\":\"town is null\"},\"success\":true}"
            }

            {
                "obj": {
                    "reachable": 1,
                    "resultMsg": "town reach"
                },
                "success": true
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_ADDRESS_REACHABLE_CHECK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseAddressReachableCheck>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 标准产品询价
        /// 该接口用于查询某流向的标准产品预估基础运费价格。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="accessToken"></param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ProductruleCheckPrice(string partnerID, string checkword, MsgDataRequestProductruleCheckPrice data, string accessToken = "", string environment = "bspgw")
        {
            /*
            说明：
            快运产品代码

            产品类型	描述	说明
            SE0100	重货包裹	适用重量20~100KG的产品
            SE0101	标准零担	适用重量100~500KG的产品
            SE0114	大票直送	适用重量500~3T的产品
            SE0020	整车直达	适用重量3T以上产品，需接入整车下单接口
            S1	顺丰特快	适用重量20KG以下小件产品
            S2	顺丰标快	适用重量20KG以下小件产品
            SE0122	特惠专配	适用特惠服务商家
            SE0091	专线普运	专线普运
            SE0130	特惠件	特惠件
            SE010101	纯重特配	纯重特配
            请求示例

            {
              "senderAddress": "高新南九道软件产业基地1栋C座17楼",
              "senderProvince": "广东省",
              "senderCity": "深圳市",
              "senderDistrict": "南山区",
              "receiverAddress": "梅林街道梅山街梅山苑二期5栋",
              "receiverProvince": "广东省",
              "receiverCity": "深圳市",
              "receiverDistrict": "福田区",
              "suburbFlg": false,
              "productCode":"SE0100",
              "currencyType": "CNY",
              "weight":20
            }
            2.3. 返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            obj	Object	O	返回数据
            属性名	参数类型	Required/Optional	描述
            totalPrice	Number(10, 3)	O	总运费
            currencyType	String(30)	O	付款货币类型，如果为空则是付款国的币种
            rate	Number(10, 3)	O	汇率
            响应示例

            {
                "obj": {
                    "currencyType": "CNY",
                    "totalPrice": 38.0
                },
                "success": true
            } 
            错误代码：

            业务类型代码	时效类型代码
            002	产品不适用于原寄地网点
            003	无法加载流向信息
            004	产品不适用此增值服务
            005	产品不支持此付款方式
            006	产品不支持此尺寸
            020	第三方物流公司不可达
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_PRODUCTRULE_CHECK_PRICE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseProductruleCheckPrice>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 图片注册推送 FOP_RECE_LTL_REGISTER_ROUTER
        /// 使用图片推送服务时，需通过此接口注册运单，并配置回调之后，方可接收到推送信息。
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponseLtlRegisterRouter LtlRegisterRouter(string body, out MsgDataRequestLtlRegisterRouter msgData)
        {
            /*	
            请求示例(msgData部分数据）

            {
                    "orderId": "1631013393",
                    "waybillNo": "SF1030355083520",
                    "imageTypes": [
                        "68"
                    ]
                }
            2.3.响应参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            响应参数示例：

            {
                "success": true
            } 
            */
            string errorCode = "";
            string errorMessage = "";
            bool success = false;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<LtlRegisterRouterRequest>(body);
                if (reqData != null)
                {
                    msgData = reqData.msgData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new MsgDataResponseLtlRegisterRouter()
            {
                errorCode = errorCode,
                errorMessage = errorMessage,
                success = success
            };
        }

        /// <summary>
        /// 大件跨境路由-运单查询
        /// 仅用于大件跨境运单路由查询，查询SF单号路由的相关信息。转单号相关的路由需配合其他接口使用。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="accessToken"></param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult IfosWaybillRouteFindOrder(string partnerID, string checkword, MsgDataRequestIfosWaybillRouteFindOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求实例（msgData部分）

            {
	            "waybillNo": "SF1020128167572",
	            "orderTime": "2023-03-01 22:20"
            }
            2.3 响应结果
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            obj	Obj	O	业务对象(见下)
            success	Boolean	R	是否成功
            业务对象(obj)

            属性名	参数类型	Required/Optional	描述
            waybillNo	String	R	运单号
            cargoVolume	BigDecimal	O	货物体积cm3
            cargoWeight	BigDecimal	O	货物重量kg
            cargoAmount	Integer	O	货物数量
            expectDeliveryTime	Date	O	签收时间或者预计派件时间（与timeTag配合使用）
            orderStatus	String	O	运单状态：10:已揽收，20:运输中，50：已签收
            payMethod	String	O	付款方式
            senderCity	String	R	发件城市
            receiverCity	String	R	收件城市
            routeInfos	Array	O	路由信息(obj Array见下)
            timeTag	String	O	对expectDeliveryTime字段的说明
            waybillAmount	Integer	O	转单号数量
            subWaybillNos	Array	O	转单号集合
            waybillReceived	Integer	O	转单号签收的数量
            waybillTransporting	Integer	O	转单号在运输中的数量
            waybillDelivering	Integer	O	转单号在派件中的数量
            路由信息(routeInfos)

            属性名	参数类型	Required/Optional	描述
            info	String	R	路由描述
            status	Integer	R	运单状态：10:已揽收，20:运输中，50：已签收
            statusDesc	String	R	状态描述
            time	Date	R	路由时间
            返回结果

            {
                "business": null,
                "date": 1678676431184,
                "errorCode": null,
                "errorMessage": null,
                "obj": {
                    "cargoAmount": 1,
                    "cargoVolume": 0.027,
                    "cargoWeight": 33,
                    "expectDeliveryTime": 1671622140000,
                    "orderStatus": "50",
                    "payMethod": "月结",
                    "receiverCity": "Sir y Fflint - Flintshire",
                    "routeInfos": [
                        {
                            "info": "货物已签收",
                            "opCode": "980",
                            "status": 50,
                            "statusDesc": "已签收",
                            "time": 1671622140000
                        },
                        {
                            "info": "境外承运商【UPS】已揽收包裹",
                            "opCode": "926",
                            "status": 20,
                            "statusDesc": "运输中",
                            "time": 1672137660000
                        },
                        {
                            "info": "预计落地时间(ETA)为【2023-02-25】",
                            "opCode": "926",
                            "status": 20,
                            "statusDesc": "运输中",
                            "time": 1677290156000
                        },
                        {
                            "info": "航班已起飞，起飞时间为【2023-02-20】",
                            "opCode": "926",
                            "status": 20,
                            "statusDesc": "运输中",
                            "time": 1676858156000
                        },
                        {
                            "info": "航班预计起飞时间(ETD)为【2023-02-19】",
                            "opCode": "926",
                            "status": 20,
                            "statusDesc": "运输中",
                            "time": 1676771756000
                        },
                        {
                            "info": "航班已录入，为【MANUKAI 457E】",
                            "opCode": "926",
                            "status": 20,
                            "statusDesc": "运输中",
                            "time": 1677135662000
                        },
                        {
                            "info": "转单号：【1Z7709XW0394043193;1Z8174V40300279941】",
                            "opCode": "926",
                            "status": 20,
                            "statusDesc": "运输中",
                            "time": 1677135662000
                        }
                    ],
                    "senderCity": "上海市",
                    "subWaybillNos": [
                        "1Z7709XW0394043193",
                        "1Z8174V40300279941"
                    ],
                    "timeTag": "签收时间",
                    "waybillAmount": 2,
                    "waybillDelivering": 0,
                    "waybillNo": "SF1020128167572",
                    "waybillReceived": 1,
                    "waybillTransporting": 1
                },
                "success": true
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_IFOS_WAYBILL_ROUTE_FIND_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseIfosWaybillRouteFindOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大件跨境路由-查询转单号路由
        /// 此功能用于大件跨境查询转单号路由。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="accessToken"></param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult IfosWaybillRouteChildren(string partnerID, string checkword, MsgDataRequestIfosWaybillRouteChildren data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求实例（msgData部分）

            {
                "waybillNo": "1Z7709XW0394043193",
                "orderTime": "2023-03-01 22:20"
            }

            2.3 返回结果
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            obj	Array	O	业务对象(obj Array)
            业务对象（obj）

            属性名	参数类型	Required/Optional	描述
            info	String	R	路由描述
            status	Integer	R	运单状态：10:已揽收，20:运输中，50：已签收
            statusDesc	String	R	状态描述
            time	Date	R	路由时间
            返回结果

            {
                "business": null,
                "date": 1678432221053,
                "errorCode": null,
                "errorMessage": null,
                "obj": [
                    {
                        "info": "货物已签收",
                        "opCode": "980",
                        "status": 50,
                        "statusDesc": "已签收",
                        "time": 1671622140000
                    },
                    {
                        "info": "Hodgkins, IL, US, Germany, The shipment has been delivered directly from the parcel center to the business customer.",
                        "opCode": "926",
                        "status": 20,
                        "statusDesc": "运输中",
                        "time": 1672137660000
                    },
                    {
                        "info": "Hodgkins, IL, US, Germany, SORTED business customer.",
                        "opCode": "926",
                        "status": 20,
                        "statusDesc": "运输中",
                        "time": 1672137660000
                    },
                    {
                        "info": "Hodgkins, IL, US, Osterweddingen, Germany, The shipment arrived in the region of recipient and will be transported to the delivery base in the next step.",
                        "opCode": "926",
                        "status": 20,
                        "statusDesc": "运输中",
                        "time": 1672106990000
                    },
                    {
                        "info": "Hodgkins, IL, US, Arrived at Facility",
                        "opCode": "926",
                        "status": 20,
                        "statusDesc": "运输中",
                        "time": 1671995100000
                    },
                    {
                        "info": "Los Angeles, CA, US, Departed from Facility",
                        "opCode": "926",
                        "status": 20,
                        "statusDesc": "运输中",
                        "time": 1671622140000
                    }
                ],
                "success": true
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_IFOS_WAYBILL_ROUTE_CHILDREN";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseIfosWaybillRouteChildren>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大件跨境路由-查询母单的转单号列表
        /// 此功能用于大件跨境查询转单号信息。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="accessToken"></param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult IfosWaybillRouteFindChildren(string partnerID, string checkword, MsgDataRequestIfosWaybillRouteFindChildren data, string accessToken = "", string environment = "bspgw")
        {
            /*
            请求实例（msgData部分）

            {
                "waybillNo": "SF1020128167572",
                "orderTime": "2023-03-01 22:20"
            }

            2.3 返回结果
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            obj	Obj	O	业务对象
            业务对象（obj）

            属性名	参数类型	Required/Optional	描述
            receiverCity	String	R	收货城市
            senderCity	String	R	发货城市
            waybillAmount	Integer	R	转单号数量
            waybillDelivering	Integer	O	转单号在派件中的数量
            waybillReceived	Integer	O	转单号签收的数量
            waybillTransporting	Integer	O	转单号在运输中的数量
            childrenList	Array	O	转单号信息
            转单号信息(childrenList)

            属性名	参数类型	Required/Optional	描述
            orderStatus	Integer	R	运单状态：10:已揽收，20:运输中，50：已签收
            receiverCity	String	R	收货城市
            senderCity	String	R	发货城市
            waybillNo	String	R	转单号
            返回结果

            {
                "business": null,
                "date": 1678678287987,
                "errorCode": null,
                "errorMessage": null,
                "obj": {
                    "childrenList": [
                        {
                            "orderStatus": "50",
                            "receiverCity": "Sir y Fflint - Flintshire",
                            "senderCity": "上海市",
                            "waybillNo": "1Z7709XW0394043193"
                        },
                        {
                            "orderStatus": "20",
                            "receiverCity": "Sir y Fflint - Flintshire",
                            "senderCity": "上海市",  
                            "waybillNo": "1Z8174V40300279941"
                        }
                    ],
                    "receiverCity": "Sir y Fflint - Flintshire",
                    "senderCity": "上海市",
                    "waybillAmount": 2,
                    "waybillDelivering": 0,
                    "waybillNo": "SF1020128167572",
                    "waybillReceived": 1,
                    "waybillTransporting": 1
                },
                "success": true
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_IFOS_WAYBILL_ROTE_FIND_CHILDREN";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseIfosWaybillRouteFindChildren>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 业务查询类

        #region 安装服务类

        /// <summary>
        /// 运单追加安装服务
        /// 客户调用此接口，可向指定的顺丰运单号追加安装服务。
        /// 此接口调用成功，只是说明已经发起向运单号追加安装服务的请求，具体是否能追加成功，需要等运单揽收后才能确定,最终追加结果通过安装状态推送接口确认。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult FisAppendOrder(string partnerID, string checkword, MsgDataRequestFisAppendOrder data, string environment = "bspgw")
        {
            /*
            1.3.3 请求示例
            请求报文:（msgData字段）:

            {
              "waybillNo": "SF12345678910",
              "cargoList": [
                {
                  "count": 1,
                  "standServiceName": "儿童学习桌",
                  "standServiceCode": "8893536",
                  "cusServiceName": "",
                  "cusServiceCode": ""
                }
              ],
              "installTypeCode": "1",
              "shopName": "淘宝",
              "outerOrderId": "15645616548489461",
              "remark": "安装备注"
            }
            1.4 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String(10)	是		API平台结果代码
            2	apiErrorMsg	String(200)	否		API平台异常信息
            3	apiResponseID	String(40)	是		API响应唯一号UUID
            4	apiResultData	String	是		业务处理详细结果
            1.4.1 元素<响应> apiResultData
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	String	是		true 请求成功，false 请求失败
            2	errorCode	String	否		错误编码，success = false时返回
            3	errorMessage	String	否		错误描述 , success = false时返回
            4	obj	Object	是		返回的详细数据
            1.4.2 元素<响应> obj
            #	属性名	类型(约束)	必填	默认值	描述
            1	installOrderId	String(64)	是		安装订单号
            2	installFee	Double	是		安装费，保留2位小数
            1.4.3 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "0001727E2494543FEA449BF48D24123F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "errorCode": null,
                    "errorMsg": null,
                    "obj": {
                        "installOrderId": "SF12345678910",
                        "installFee": "719"
                    }
                }
            }
            失败响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "0001727E2494543FEA449BF48D24123F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "10003",
                    "errorMsg": "未查询到运单号信息"
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_APPEND_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisAppendOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 安装状态推送 FOP_PUSH_FIS_INSTALL_ROUTER
        /// 有新的安装状态节点产生时，顺丰会调用此接口将状态推送给客户
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponseFisInstallRouter FisInstallRouter(string body, out MsgDataRequestFisInstallRouter msgData)
        {
            /*	
            1.2.4 请求示例
            请求报文:（msgData字段）:

            {
              "waybillNo": "SF12345678910",
              "installOrderId": "SF12345678910",
              "operateCode": "OP000001",
              "masterName": "顺小丰",
              "masterPhone": "13344445555",
              "imgUrls": ["www.baidu.com","www.baidu.com"],
              "operateTime": "2023-05-20 15:59:00",
              "confirmCode": "123456"
            }
            1.3 响应参数，客户系统按此结构返回响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	boolean	是		true 请求成功，false 请求失败 ,false时顺丰侧会进行重试
            2	errorCode	String	否		错误编码，success = false时返回
            3	errorMessage	String	否		错误描述 , success = false时返回
            1.3.1 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                    "success": true,
                    "errorCode": null,
                    "errorMsg": null  

            }
            失败响应
            {
                    "success": false,
                    "errorCode": "客户定义",
                    "errorMsg": "客户定义"  

            } 
            */
            string errorCode = "";
            string errorMessage = "";
            bool success = false;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<FisInstallRouterRequest>(body);
                if (reqData != null)
                {
                    msgData = reqData.msgData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new MsgDataResponseFisInstallRouter()
            {
                errorCode = errorCode,
                errorMessage = errorMessage,
                success = success
            };
        }
        
        /// <summary>
        /// 取消安装服务
        /// 客户调用此接口，可将追加安装服务的请求取消
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult FisCancelInstall(string partnerID, string checkword, MsgDataRequestFisCancelInstall data, string environment = "bspgw")
        {
            /*	
            2.2.4 请求示例
            请求报文:（msgData字段）:

            {
              "waybillNo": "SF12345678910",
              "orderId": "SF12345678910"
            }
            1.3. 公共响应参数
            #	属性名	类型(约束)	必填	默认值	描述
            1	apiResultCode	String(10)	是		API平台结果代码
            2	apiErrorMsg	String(200)	否		API平台异常信息
            3	apiResponseID	String(40)	是		API响应唯一号UUID
            4	apiResultData	String	是		业务处理详细结果
            1.3.1 元素<响应> apiResultData
            #	属性名	类型(约束)	必填	默认值	描述
            1	success	boolean	是		true 请求成功，false 请求失败
            2	errorCode	String	否		错误编码，success = false时返回
            3	errorMessage	String	否		错误描述 , success = false时返回
            1.3.2 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "0001727E2494543FEA449BF48D24123F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "errorCode": null,
                    "errorMsg": null
                }
            }
            失败响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "0001727E2494543FEA449BF48D24123F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "10010",
                    "errorMsg": "运单已揽收，不可取消"
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_CANCEL_INSTALL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisCancelInstall>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 安装服务类

        #region 整车直达类

        /// <summary>
        /// 下单
        /// 此接口给客户提供重货专运下单功能。可以根据需要选择是否生成运单号。如果选择不生成，请传入运单号。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult TlCreateOrder(string partnerID, string checkword, MsgDataRequestTlCreateOrder data, string environment = "bspgw")
        {
            /*
            请求示例

            {

            }
            返回参数

            属性名	类型（约束）	必填	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误原因
            obj	Object	N	返回对象
            Object

            属性名	类型（约束）	必填	描述
            orderId	String(64)	Y	客户订单号
            waybillNo	String(64)	N	运单号，需要生成运单号的时候，才会返回
            signBackWaybillNo	String(64)	N	需要签回单时会生成，回单号
            2.6 错误码列表
            错误码	描述
            80000	系统异常
            80001	签名错误
            80002	请求过期
            80003	非法参数
            80201	业务异常
            80500	请求超时
            80503	订单不存在 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_TL_CREATE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseTlCreateOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 取消订单
        /// 此接口在客户需要取消订单时使用，需要注意的是，订单在某些特定的状态下，才能取消。具体取消结果，以返回值为准。如订单不能取消，可以参考errorMessage字段。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult TlCancelOrder(string partnerID, string checkword, MsgDataRequestTlCancelOrder data, string environment = "bspgw")
        {
            /*
            输入参数

            属性名	类型（约束）	必填	描述
            orderId		Y	
            waybillNo	String(64)	N	
            operator	String(64)	N	
            cancelReason	String(200)	N	
            参数示例

            {
                "orderId":151515481213,
                "waybillNo":"SF24343455",
                "operator":"李丰田",
                "cancelReason":"15985841721"
            }
            返回参数

            属性名	类型（约束）	必填	描述
            success	Boolean	Y	是否成功
            errorCode	String	N	错误代码
            errorMessage	String	N	错误原因
            2.6 错误码列表
            错误码	描述
            80000	系统异常
            80001	签名错误
            80002	请求过期
            80003	非法参数
            80201	业务异常
            80500	请求超时
            80503	订单不存在 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_TL_CANCEL_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseTlCancelOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /*
        订单状态推送 FOP_PUSH_LTL_ORDER_STATUS
        此接口推送订单状态，如对接方需要跟踪订单状态（已接收，已取消等），可以对接此接口。 
        （运单查询推送类—订单状态推送）
        */

        /*
        订单路由推送 FOP_PUSH_LTL_ROUTER
        该接口用于对外路由推送。 
        （运单查询推送类—订单路由推送）
        */

        /// <summary>
        /// 订单查询
        /// 该接口用于外部合作伙伴查询订单信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult TlSearchOrder(string partnerID, string checkword, MsgDataRequestTlSearchOrder data, string environment = "bspgw")
        {
            /*
            请求参数

            属性名	参数类型	必填	描述
            orderId	String(64)	Y	客户订单号
            waybillNo	String(64)	N	顺丰运单号
            请求参数示例

            {
                "orderId": "817674447",
                "waybillNo": null
            }
            返回参数

            属性名	类型（约束）	必填	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误原因
            obj	Object	N	
            obj

            属性名	类型（约束）	必填	描述
            orderId	String(64)	Y	客户订单号
            waybillNo	String(64)	N	顺丰运单号
            signBackWaybillNo	String(64)	N	顺丰签回单号
            2.6 错误码列表
            错误码	描述
            80000	系统异常
            80001	签名错误
            80002	请求过期
            80003	非法参数
            80201	业务异常
            80500	请求超时
            80503	订单不存在 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_TL_SEARCH_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseTlSearchOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 整车直达类

        #region 城市配送类

        /// <summary>
        /// 城市配送货运下单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult UftlOfConfirmOrder(string partnerID, string checkword, MsgDataRequestUftlOfConfirmOrder data, string environment = "bspgw")
        {
            /*
            请求示例

            {
                "addressList":[
                    {
                        "address":"广东省深圳市南山区桃园路",
                        "addresDetail":"202号",
                        "floor":0,
                        "lift":0,
                        "replyStatus":0,
                        "contact":"张三",
                        "tel":"13112345678",
                        "coordinate":"113.93041,22.53332"
                    },
                    {
                        "address":"广东省深圳市宝安区松白路37-7号松岗汽车站",
                        "addressDetail":"202号",
                        "floor":0,
                        "lift":0,
                        "replyStatus":0,
                        "contact":"李四",
                        "tel":"13112345679",
                        "coordinate":"113.852053124,22.769589248"
                    }
                ],
                "phone":"13112345678",
                "nickname":"张三",
                "carNum":1,
                "sendStartTime":"2022-03-05 23:00:00",
                "vehicle":"中面",
                "vasFeeList":[
                    {
                        "vasCode":"DIANZIHUIDAN",
                        "num":1
                    }
                ],
                "place":"深圳市",
                "clientCode":"FOP_TEST"
            }
            返回参数

            属性名	类型（约束）	描述
            status	String	错误代码
            msg	String	错误原因
            data	Object	返回对象
            响应data

            属性名	类型（约束）	必填	描述
            orderNo	String	Y	订单号
            响应示例

            1.{
              "status": 10000,
              "msg": "车型不能为空",
              "data": null
            }
            2.{
              "status": 200,
              "msg": "success",
              "data": {
                "orderNo": "U20220302300015"
              }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_UFTL_OF_CONFIRM_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUftlOfConfirmOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.status == "200")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.status;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 城市配送货运-轨迹推送麦芽田 FOP_PUSH_UFTL_OF_TRACE_MYT
        /// 有新的轨迹状态节点产生时，顺丰会调用此接口推送订单轨迹信息给接入方
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponseUftlOfTraceMyt UftlOfTraceMyt(string body, out MsgDataRequestUftlOfTraceMyt msgData)
        {
            int status = 500;
            bool success = false;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<UftlOfTraceMytRequest>(body);
                if (reqData != null)
                {
                    msgData = JsonHelper.DeserializeObject<MsgDataRequestUftlOfTraceMyt>(reqData.msgData);
                    success = true;
                    status = 200;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponseUftlOfTraceMyt()
            {
                success = success,
                data = null,
                msg = null,
                status = status
            };
        }

        /// <summary>
        /// 城市配送货运-轨迹推送麦芽田测试 FOP_PUSH_UFTL_OF_TRACE_MYT_TEST
        /// 有新的轨迹状态节点产生时，顺丰会调用此接口推送订单轨迹信息给接入方
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponseUftlOfTraceMytTest UftlOfTraceMytTest(string body, out MsgDataRequestUftlOfTraceMytTest msgData)
        {
            int status = 500;
            bool success = false;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<UftlOfTraceMytTestRequest>(body);
                if (reqData != null)
                {
                    msgData = JsonHelper.DeserializeObject<MsgDataRequestUftlOfTraceMytTest>(reqData.msgData);
                    success = true;
                    status = 200;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponseUftlOfTraceMytTest()
            {
                success = success,
                data = null,
                msg = null,
                status = status
            };
        }

        /// <summary>
        /// 城市配送货运-计费
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult UftlOfCalcFee(string partnerID, string checkword, MsgDataRequestUftlOfCalcFee data, string environment = "bspgw")
        {
            /*
            参数示例

            {

               "vehicle": "4.2米箱货",
               "carNum": 1,
               "sendStartTime": "2020-02-27 14:00:00",
               "city": "深圳市",
               "orderAddressVOList": [
                  {
                      "address": "深圳市福田区梅康路",
                      "floor": 3,
                      "lift": 1,
                      "contact": "张三",
                      "tel": "13112345678",
                      "replyStatus":0
                  },
                  {
                      "address": "深圳市南山区招商路",
                      "floor": 4,
                      "lift": 1,
                      "contact": "李四",
                      "tel": "15000000008",
                      "replyStatus":7
                   }],
               "orderVasFeeList": [
                   {
                      "vasCode": "DIANZIHUIDAN",
                      "num": 1
                   }]
            }
            返回参数

            属性名	类型（约束）	描述
            status	String	错误代码
            msg	String	错误原因
            data	Object	返回对象
            响应data

            属性名	类型（约束）	必填	描述
            baseFee	BigDecimal	Y	里程支付金额(元)
            totalFee	BigDecimal	Y	总费用(元)
            totalVasFee	BigDecimal	Y	增值服务总费用(元)
            mileage	BigDecimal	Y	里程(千米)
            orderVasFeeList	Array	Y	增值服务费明细
            orderVasFeeList:

            属性名	类型（约束）	必填	描述
            vasCode	String	Y	增值服务编码
            vehicle	String	Y	车型
            num	int	Y	保价金额、包装箱数量
            fee	BigDecimal	Y	增值服务费用(元)
            name	String	Y	增值服务名称
            响应示例

            {
              "status": 200,
              "msg": "success",
              "data": {
                "baseFee": 52.20,
                "totalFee": 419.30,
                "totalVasFee": 367.10,
                "mileage": 32.195,
                "cutPayment": 1.00,
                "orderVasFeeList": [
                  {
                    "vasCode": "BAOZHUANGXIANG",
                    "vehicle": "箱货",
                    "num": 2,
                    "fee": 12.00,
                    "name": "包装箱"
                  },
                  {
                    "vasCode": "BAOJIA",
                    "vehicle": "箱货",
                    "num": 3000,
                    "fee": 9.00, ,
                    "name": "保价"
                  },
                  {
                    "vasCode": "FANCHENG",
                    "vehicle": "箱货",
                    "fee": 26.10,
                    "name": "返程"
                  },
                  {
                    "vasCode": "YEJIANFUWU",
                    "vehicle": "箱货" 
                    "fee": 200.00,
                    "name": "夜间服务"
                  }
                ]
              }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_UFTL_OF_CALC_FEE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUftlOfCalcFee>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.status == "200")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.status;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 城市配送货运-订单列表
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult UftlOfOrderList(string partnerID, string checkword, MsgDataRequestUftlOfOrderList data, string environment = "bspgw")
        {
            /*
            请求参数（公共参数里面的 msgData 字段）

            属性名	类型（约束）	必填	描述
            clientCode	String	Y	
            phone	String	Y	
            createTimeStart	String	N	下单开始时间
            createTimeEnd	String	N	下单结束时间
            index	Int	N	分页index（1开始）
            size	Int	N	分页size（默认10）
            请求示例

            {
                "phone":"13112345678",
                "clientCode":"FOP_TEST"
            }
            响应data

            属性名	类型（约束）	必填	描述
            orderNo	String	Y	订单号
            orderTime	String	Y	下单时间
            finishTime	String	Y	完成服务时间
            contact	String	Y	联系人
            tel	String	Y	联系电话
            orderStatus	String	Y	订单状态: 1待处理 2服务中 3已完成 4已取消 5待支付 9供应商待处理
            remark	String	Y	备注
            customerOrderNo	String	Y	客户单号
            totalFee	Demical	Y	总费用,单位:元 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_UFTL_OF_ORDER_LIST";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUftlOfOrderList>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.status == "200")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.status;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 城市配送货运-订单详情
        /// 该接口用于查询订单详情
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult UftlOfOrderDetail(string partnerID, string checkword, MsgDataRequestUftlOfOrderDetail data, string environment = "bspgw")
        {
            /*
            请求参数（公共参数里面的 msgData 字段）

            属性名	类型（约束）	必填	描述
            clientCode	String	Y	
            orderNo	String	N	
            customerOrderNo	String	N	
            请求参数示例

            {
                "orderNo": "U20200227000026"
            }
            返回参数

            属性名	类型（约束）	描述
            status	String	错误代码
            msg	String	错误原因
            data	Object	返回对象
            响应data

            属性名	类型（约束）	必填	描述
            orderNo	String	Y	订单号
            orderTime	String	Y	下单时间
            finishTime	String	Y	完成服务时间
            contact	String	Y	联系人
            tel	String	Y	联系电话
            sendStartTime	String	Y	预约上门时间
            orderStatus	String	Y	订单状态: 1待处理 2服务中 3已完成 4已取消 5待支付 9供应商待处理
            mileage	Demical	Y	里程,单位:km
            mileageFee	Demical	Y	里程费用,单位:元
            remark	String	Y	备注
            customerOrderNo	String	N	客户单号
            carNumber	int	Y	车数量
            totalFee	Demical	Y	总费用,单位:元
            vasTotal	Demical	Y	增值服务总费用,单位:元
            vehicle	String	Y	车型
            city	String	Y	城市
            chauffeurName	String	Y	司机姓名
            chauffeurTel	String	Y	司机电话
            chauffeurCoordinate	String	Y	司机最新定位信息(经度纬度英文逗号分隔)
            cancelMessage	String	Y	取消订单原因
            addressList	array	Y	订单发货及收货地址集合
            addressList:

            属性名	类型（约束）	必填	描述
            serialNo	int	Y	序号：0为搬出地址，后续为搬入地址
            address	String	Y	地址
            floor	int	Y	楼层
            lift	int	Y	有无电梯：0无，1有
            contact	String	Y	联系人名称
            tel	String	Y	联系电话
            响应示例

            {
                "status": 200,
                "msg": "Success",
                "data": {
                    "orderNo": "U20200227000026",
                    "orderTime": "2020-02-27 14:43:56",
                    "finishTime": "2020-02-27 19:52:43",
                    "monthSettlementCard": "142123364",
                    "contact": "张三",
                    "tel": "15000000000",
                    "sendStartTime": "2020-02-27 16:50:00",
                    "orderStatus": 3,
                    "mileage": 4.98,
                    "mileageFee": 143.20,
                    "remark": "请准时上门取件",
                    "carNumber":1,
                    "totalFee": 143.20,
                    "vasTotal": 0,
                    "vehicle": "依维柯",    
                    "city": "深圳",
                    "payType": 2,
                    "chauffeurName": "老司机",
                    "chauffeurTel": "13333333333",
                    "chauffeurCoordinate": "113.937985,22.523394",
                    "cancelMessage": "业务取消",
                    "orderAddress": [{
                        "serialNo": 0,
                        "address": "深圳市福田区梅康路",
                        "floor":3,
                        "lift": 1,
                        "contact": "张三",
                        "tel": "15000000000"
                    },
                    {
                        "serialNo": "1",
                        "address": "深圳市南山区招商路",
                        "floor":4,
                        "lift": 1,
                        "contact": "李四",
                        "tel": "15000000000"
                    }]
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_UFTL_OF_ORDER_DETAIL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUftlOfOrderDetail>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.status == "200")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.status;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 城市配送货运-订单取消
        /// 该接口用于取消订单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult UftlOfCancelOrder(string partnerID, string checkword, MsgDataRequestUftlOfCancelOrder data, string environment = "bspgw")
        {
            /*
            请求参数（公共参数里面的 msgData 字段）

            属性名	参数类型	必填	描述
            clientCode	String	Y	
            orderNo	String	N	订单号（或者传客户单号）
            customerOrderNo	String	N	客户单号
            cancelMessage	String	Y	取消订单原因
            请求参数示例

            {
                    "orderNo": "U20200227000027",
                    "cancelMessage": "订单地址填写错误"
            }
            返回参数

            属性名	类型（约束）	描述
            status	String	错误代码
            msg	String	错误原因
            data	Object	返回对象
            响应示例

            {
                "status ":200,
                "msg":"成功",
                "data":""
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_UFTL_OF_CANCEL_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUftlOfCancelOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        if (msgDataResponse.status == "200")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.status;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 城市配送货运-城市可用增值服务
        /// 该接口用于查询该城市可用增值服务
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult UftlOfCityAvailableList(string partnerID, string checkword, MsgDataRequestUftlOfCityAvailableList data, string environment = "bspgw")
        {
            /*
            请求参数（公共参数里面的 msgData 字段）

            属性名	参数类型	必填	描述
            clientCode	String	Y	
            place	String	Y	
            vehicle	String	Y	车型
            请求参数示例

            {
                    "place": "深圳市",
                    "vehicle": "4.2米箱货"
            }
            返回参数

            属性名	类型（约束）	描述
            status	String	错误代码
            msg	String	错误原因
            data	Object	返回对象
            响应data

            属性名	类型（约束）	必填	描述
            vasCode	String	Y	增值费编码
            name	String	Y	名称
            numUnit	String	Y	单位
            响应示例

            {
                "status": 200,
                "msg": "success",
                "data": [
                    {
                        "vasCode": "QITA",
                        "name": "其他费用",
                        "numUnit": null,
                        "infoName": null
                    },
                    {
                        "vasCode": "TINGCHEFEI",
                        "name": "高速/停车/入仓费",
                        "numUnit": null,
                        "infoName": null
                    },
                    {
                        "vasCode": "DENGDAIFEI",
                        "name": "等待费",
                        "numUnit": "min",
                        "infoName": "等待时间"
                    },
                    {
                        "vasCode": "BANYUNRENGONG",
                        "name": "搬运人工费",
                        "numUnit": "人",
                        "infoName": "新增搬运人数"
                    },
                    {
                        "vasCode": "BAOZHUANGXIANG",
                        "name": "新增包装箱费",
                        "numUnit": "个",
                        "infoName": "司机新增包装箱"
                    },
                    {
                        "vasCode": "DAJIANBANYUN",
                        "name": "大件搬运费",
                        "numUnit": "件",
                        "infoName": "大件搬运"
                    }
                ]
            }
            3.6.1 增值服务编码表
            增值服务编码	描述
            BAOJIA	保价
            CHUANDIAN	串点
            ZHUANGXIE	装卸
            SHANGLOU	上楼
            FANCHENG	返程
            WEIBAN	尾板
            SHUANGPAIZUO	双排座
            QIANHUIDAN	签回单
            DIANZIHUIDAN	电子回单
            YEJIANFUWU	夜间服务
            BAOZHUANGXIANG	包装箱
            DAJIANBANYUN	大件搬运
            DENGDAIFEI	等待
            BANYUNRENGONG	搬运人工
            TINGCHEFEI	高速/停车
            QITA	其他 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_UFTL_OF_CITY_AVAILABLE_VAS_LIST";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUftlOfCityAvailableList>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.status == "200")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.status;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 城市配送货运-城市可用车型
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult UftlOfCityVehicles(string partnerID, string checkword, MsgDataRequestUftlOfCityVehicles data, string environment = "bspgw")
        {
            /*
            请求参数（公共参数里面的 msgData 字段）

            属性名	参数类型	必填	描述
            city	String	Y	
            orderCategory	int	Y	
            clientCode	String	Y	
            请求参数示例

            {
               "city": "深圳市",
               "orderCategory":2,
               "clientCode":"WLST" 
            }
            返回参数

            属性名	类型（约束）	描述
            status	String	状态码
            msg	String	返回信息
            data	List<Object>	返回对象
            响应data

            属性名	类型（约束）	描述
            model	String	车型
            weight	Double	载重，单位：吨
            length	Double	车箱长度，单位：米
            width	Double	箱宽度，单位：米
            height	Double	车箱高度，单位：米
            volume	Double	车箱容积，单位：立方米
            flag	Integer	是否有特殊规格
            specialModelList	array	可选特殊规格
            photo	String	车型图片
            SpecialModel:

            属性名	类型（约束）	必填	描述
            name	String	Y	特殊规格名称
            code	String	Y	特殊规格编码
            响应示例

            {
                "status": 200,
                "msg": "success",
                "data": {
                    "carModels": [
                        {
                            "model": "依维柯",
                            "weight": 3.50,
                            "length": 2.80,
                            "width": 1.80,
                            "height": 2.20,
                            "volume": 11.10,
                            "flag": 0,
                            "photo":"",
                            "specialModelList": [
                                {
                                    "name": "双排座",
                                    "code": "SHUANGPAIZUO"
                                },
                                {
                                    "name": "尾板",
                                    "code": "WEIBAN"
                                }
                            ]
                        }
                    ]
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_UFTL_OF_CITY_VEHICLES";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUftlOfCityVehicles>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.status == "200")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.status;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 城市配送货运-开通城市
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult UftlOfCityList(string partnerID, string checkword, MsgDataRequestUftlOfCityList data, string environment = "bspgw")
        {
            /*
            请求参数（公共参数里面的 msgData 字段）

            属性名	参数类型	必填	描述
            clientCode	String	Y	
            请求参数示例

            {
               "cilentCode":"WLST"
            }
            返回参数

            属性名	类型（约束）	描述
            status	String	错误代码
            msg	String	错误原因
            data	List<String>	返回对象
            响应示例

            {
                "status": 200,
                "msg": "success",
                "data": [
                    "深圳市",
                    "成都市"
                ]
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_UFTL_OF_CITY_LIST";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUftlOfCityList>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.status == "200")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.status;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 城市配送货运-城市可用预约上门时间列表
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult UftlOfSendStartTimeList(string partnerID, string checkword, MsgDataRequestUftlOfSendStartTimeList data, string environment = "bspgw")
        {
            /*
            请求参数（公共参数里面的 msgData 字段）

            属性名	参数类型	必填	描述
            clientCode		Y	客户编码（由SF提供）
            city	String	Y	城市
            请求参数示例

            {
               "cilentCode":"FOP_TEST",
               "city":"深圳市"  
            }
            返回参数

            属性名	类型（约束）	描述
            status	String	错误代码
            msg	String	错误原因
            data	List<String>	返回对象
            响应data

            属性名	类型（约束）	必填	描述
            startTime	String	Y	开始时间
            endTime	String	Y	结束时间
            响应示例

            {
                "status": 200,
                "msg": "success",
                "data": {
                    "startTime": "08:00:00",
                    "endTime": "23:00:00"
                }
            } 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_UFTL_OF_SEND_START_TIME_LIST";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseUftlOfSendStartTimeList>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.msg;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.data);
                        if (msgDataResponse.status == "200")
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.status;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 城市配送类

        #region 转寄外发类

        /// <summary>
        /// 取消订单
        /// SF对已外发的转寄订单可以通过此接口取消订单。
        /// 注意：未提货（订单状态<5）的订单，必须支持取消。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardCancelOrder(string partnerID, string checkword, MsgDataRequestForwardCancelOrder data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            forwardOrderId	Long	R	SF快运转寄的订单号
            waybillNo	String(64)	O	转寄的运单号
            cancelReason	String(200)	O	取消原因
            operator	String(30)	O	操作人
            cancelTime	Long	R	取消时间 TimeStamp
            参数示例

            {
                "forwardOrderId": "202024081900040",
                "cancelTime": 1724049943984,
                "cancelReason": "客户要求取消",
                "operator": "01402222"
            }
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功, 返回”true”表示订单取消成功 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_PUSH_FORWARD_CANCEL_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardCancelOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 实时位置查询
        /// SF会通过此接口查询运单的实时位置。返回，当前货物的最新位置即可。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardQueryTrack(string partnerID, string checkword, MsgDataRequestForwardQueryTrack data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            waybillNo	String(64)	R	运单号
            返回参数
            属性名	参数类型	Required/Optional	描述
            waybillNo	String(64)	R	运单号
            timestamp	String(19)	R	时间点
            licensePlateNumber	String(32)	R	车牌号
            driver	String(32)	O	司机
            driverPhone	String(32)	O	司机电话
            province	String(20)	O	省
            city	String(20)	O	市
            county	String(20)	O	区
            address	String(256)	O	当前地址
            latitude	Number	O	当前纬度
            longitude	Number	O	当前经度
            elevation	Number	O	当前海拔
            latLongType	Int	O	坐标类型, 1:百度 2：高德 3：Google
            source	String(10)	R	位置信息来源。如人工维护、GPS、定点签到等
            remark	String(256)	O	备注信息
            stauts	Int	O	订单状态 参见附件6.1 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_PUSH_FORWARD_QUERY_TRACK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardQueryTrack>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 回单上传接口
        /// 签收图片上传接口
        /// 派送完成后，需要上传客户的签字等图片给SF，SF经过审核后，运单会转变为签收状态
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardUploadSignImage(string partnerID, string checkword, MsgDataRequestForwardUploadSignImage data, string environment = "bspgw")
        {
            /*
            入参字段：
            字段名	是否必须	类型	含义	备注
            waybillNo	Y	String	运单号	
            scanStation	N	String	扫描点部代码	
            scanTime	Y	String	扫描时间	格式：yyyy-MM-dd HH:mm:ss
            scanOperator	N	String	扫描员工编码	
            scanAreaCode	N	String	扫描大区网点	
            picUrl	Y	String	图片URL	
            remark	N	String	备注	图片地址必须可以外网访问
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码 详细错误代码列表参见：
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_UPLOAD_SIGN_IMAGE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardUploadSignImage>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /*
        工单下发接口 FOP_PUSH_FORWARD_PUSH_SERVICE_ORDER
        工单处理结果上传 FOP_RECE_FORWARD_UPDATE_SERVICE_ORDER
        */

        /// <summary>
        /// 异常拦截信息下发
        /// 当运单出现异常情况，需要通缉时，SF会使用此接口下发异常件信息。第三方物流公司须协助通缉此运单。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardPushExceptionInfo(string partnerID, string checkword, MsgDataRequestForwardPushExceptionInfo data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            waybillNo	String(64)	R	运单号
            exceptionType	String(32)	R	异常类型
            exceptionDesc	String(255)	R	异常描述
            contact	String(32)	O	联系人
            contactPhone	String(32)	O	联系电话
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码 详细错误代码列表参见：
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功，代表成功接收 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_PUSH_FORWARD_PUSH_EXCEPTION_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardPushExceptionInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 提货司机信息上传
        /// 当承运公司分配提货司机来联系人信息后，须第一时间上传司机信息。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardUploadVehicle(string partnerID, string checkword, MsgDataRequestForwardUploadVehicle data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            forwardOrderId	Long(20)	R	SF快运转寄的订单号
            waybillNo	String(64)	R	运单号
            driver	String(32)	R	司机姓名
            driverMobile	String(32)	R	司机电话
            licensePlateNumber	String(10)	R	车牌号
            carrierCompany	String(64)	O	承运商公司名称
            carrierPhone	String(32)	O	承运商公司联系电话
            请求示例

            {
                "forwardOrderId":151515481213,
                "waybillNo":"SF24343455",
                "driver":"李丰田",
                "driverMobile":"15985841721",
                "licensePlateNumber":"粤B 1F5489",
            }
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码 详细错误代码列表参见：
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功，代表成功接收
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_UPLOAD_VEHICLE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardUploadVehicle>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 轨迹批量上传
        /// 此接口为5.5接口的批量接口,注意批量上传轨迹，只支持同属一一个运单号的轨迹。入参为5.5的List。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardUploadTrackBatch(string partnerID, string checkword, List<MsgDataRequestForwardUploadTrackBatch> data, string environment = "bspgw")
        {
            /*
            入参示例

            [
                {
                    "waybillNo": "SF1223548122",
                    "timestamp": 1561098516251,
                    "licensePlateNumber": "粤B 888888",
                    "driver": "李丰田",
                    "driverPhone": "15985584758",
                    "province": "广东省",
                    "city": "深圳市",
                    "county": "南山区",
                    "address": "软件产业基地",
                    "latitude": 22.62,
                    "longitude": 114.07,
                    "elevation": 10.52,
                    "latLongType": 2,
                    "source": "GPS",
                    "remark": ""
                },
                {
                    "waybillNo": "SF1223548122",
                    "timestamp": 1561098516251,
                    "licensePlateNumber": "粤B 888888",
                    "driver": "李丰田",
                    "driverPhone": "15985584758",
                    "province": "广东省",
                    "city": "深圳市",
                    "county": "福田区",
                    "address": "彩田集散中心",
                    "latitude": 22.62,
                    "longitude": 114.07,
                    "elevation": 10.52,
                    "latLongType": 2,
                    "source": "GPS",
                    "remark": ""
                }
            ]
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码 详细错误代码列表参见：
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功，代表成功接收
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_UPLOAD_TRACK_BATCH";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardUploadTrackBatch>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 轨迹查询接口
        /// 此接口由SF发起，调用承运商的CP接口，查询运单的路由，要求返回该运单的全部的路由信息。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardQueryRouter(string partnerID, string checkword, MsgDataRequestForwardQueryRouter data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            waybillNo	String(64)	R	运单号
            {
                "waybillNo":"444138405992"
            }
            返回参数
            参见5.4 路由上传接口 描述的路由上传接口请求参数。要求把全部的路由信息一次性返回。返回示例：

            {
                "waybillNo": "12345678",
                "status": 0,
                "routerInfos": [
                    {
                        "uniqueId": "2388561349448722724",
                        "status": 0,
                        "operator": "王大雷",
                        "operateTime": "2019-05-18 12:30:00",
                        "context": "广西壮族自治区贺州市八步区大宁镇公司岳** 派件中 派件员电话18877457789",
                        "cityName": "贺州市"
                    },
                    {
                        "uniqueId": "2388561349448722",
                        "status": 0,
                        "operator": "王大雷",
                        "operateTime": "2019-05-18 12:30:00",
                        "context": "广西省贺州市公司 已发出,下一站 广西壮族自治区贺州市八步区大宁镇",
                        "cityName": "贺州市"
                    }
                ]
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_PUSH_FORWARD_QUERY_ROUTER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardQueryRouter>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /*
        修改订单信息 FOP_PUSH_FORWARD_UPDATE_ORDER
        承运商在已提货状态前的运单，SF可以通过此接口修改订单信息。数据原下单接口完全一样。 
        */

        /// <summary>
        /// 运单备注上传
        /// CP通过此接口上传运单的备注信息到SF
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardUploadWaybillRemark(string partnerID, string checkword, MsgDataRequestForwardUploadWaybillRemark data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            waybillNo	String(64)	R	运单号
            operator	String(64)	R	操作人姓名
            remark	String(500)	R	备注内容
            入参示例

            {
                "waybillNo": "444124310163",
                "operator": "王大雷",
                "remark": "易碎物品"
            }
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码 详细错误代码列表参见：
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_UPLOAD_WAYBILL_REMARK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardUploadWaybillRemark>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 运单签回单号上传
        /// CP通过此接口上传运单的签回单到SF
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardUploadReceipt(string partnerID, string checkword, MsgDataRequestForwardUploadReceipt data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            waybillNo	String(64)	R	运单号
            returnWaybillNo	String(64)	R	签回单号
            company	String(64)	R	物流公司，如顺丰物流、圆通物流，申通物流等等
            入参示例

            {
                "waybillNo": "SF1011733905461",
                "returnWaybillNo": "SF1011712484554",
                "company": "顺丰物流"
            }
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码 详细错误代码列表参见：
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_UPLOAD_RECEIPT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardUploadReceipt>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 下单
        /// SF在有转寄需求的时候，会调用承运商的下单接口。承运商下单接口地址由SF在系统中统一配置，需要在3秒内返回响应。
        /// 1. 接收到顺丰下外发订单后，订单状态有任何变更(接单、流单等），必须第一时间上传。同时，提供查询接口，返回实时状态。
        /// 2. 必须根据外发的订单号幂等（同一个订单可能存在多次下单请求，请返回同一个结果）。
        /// 3. 如果在下单时可以判断出不能接单，可以在下单接口直接返回错误，并附上说明（errorMessage字段）。如：地址不可达、货物超重等。
        /// 4. 对于不同的供应商，如果需要前置校验是否可达，可以接入接口FOP_PUSH_FORWARD_QUERY_LABEL。如果该接口返回不可达，系统将开不出运单。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardPushOrder(string partnerID, string checkword, MsgDataRequestForwardPushOrder data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            forwardOrderId	Long(20)	R	SF快运转寄的订单号
            waybillNo	String(64)	R	快运转寄的运单号,一般是SF1+12为数字
            subWaybillNos	String(300)	O	快运转寄的运单包含的子运单号,一个运单号可能有多个子运单，多个会用”,”分割。SF2+12位数字为子单号
            pickUpProvince	String(30)	O	提货的省级行政区名称。 必须是标准的省级行政区名称如：北京、广东省、广西壮族自治区等
            pickUpCity	String(30)	O	提货的所在地级行政区名称。 必须是标准的城市称谓 如：北京市、深圳市、大理白族自治州等
            pickUpCounty	String(30)	O	提货的所在县/区级行政区名称
            pickUpAddress	String(30)	R	提货的详细地址如新洲十一街万基商务大厦10楼。 若pickUpProvince、pickUpCity、pickUpCounty 未填写，此字段要求填写详细的省市区
            pickUpTime	String(19)	O	提货时间，格式yyyy-MM-dd HH:mm:ss
            pickUpContact	String(100)	O	提货联系人
            pickUpPhone	String(30)	R	提货联系人手机
            pickUpTel	String(30)	O	提货联系人电话
            deliveryType	Number(1)	R	派送方式 1 派送;2 自提
            deliveryProvince	String(30)	O	送货地省
            deliveryCity	String(30)	O	送货地市
            deliveryCounty	String(30)	O	送货地区
            deliveryAddress	String(256)	R	送货地址
            deliveryContact	String(30)	R	送货联系人
            deliveryPhone	String(30)	R	送货联系手机
            deliveryTel	String(30)	O	送货联系电话
            receiverTime	String(19)	O	派送时间/自提时间, 格式: yyyy-MM-dd HH:mm:ss
            receiverProvince	String(30)	O	派送地省
            receiverCity	String(30)	O	派送地市
            receiverCounty	String(30)	O	派送地区
            receiverAddress	String(256)	R	派送地址
            receiverContact	String(30)	R	派送联系人
            receiverPhone	String(30)	R	派送联系手机
            receiverTel	String(30)	O	派送联系电话
            totalCargoResume	String(50)	O	货物简述
            totalPackageCount	Int	O	总件数（包装）
            totalCargoWeight	Number(16,3)	R	货物的总重量(单位:千克)
            totalCargoVolume	Number(16,3)	R	货物的总体积（单位:立方厘米)
            declaredValue	Number(16,3)	O	声明价值
            currencyCode	String(3)	O	声明价值的货币类型，如 CNY,HKD
            pickUpRemark	String(500)	O	提货备注
            deliveryRemark	String(500)	O	送货备注
            productCode	String(10)	O	快运产品代码
            deptCode	String(10)	O	网点代码
            cargoes	Array	O	货物明细，详见 Cargo
            addedServices	Array	O	增值服务，详见 AddedService
            fees	Array	O	费用信息，详见Fee
            extend	Extend	o	扩展字段，详见 Extend
            payables	Array	O	供应商的费用信息 详见payable
            Cargo

            属性名	参数类型	Required/Optional	描述
            name	String(100)	O	货物名称
            unit	String(10)	O	单位， 如个、台、件
            category	String(100)	O	货物的分类
            amount	String	O	数量(此字段可能自带单位)
            length	Number(10, 3)	O	长 单位默认为厘米
            height	Number(10, 3)	O	高 单位默认为厘米
            width	Number(10, 3)	O	宽 单位默认为厘米
            volume	Number(10, 3)	O	体积 单位默认为立方米
            weight	Number(10, 3)	O	重量 单位:kg
            boxNo	String(200)	O	箱号
            AddedService

            属性名	参数类型	Required/Optional	描述
            name	String(100)	O	增值服务名
            code	String(100)	O	增值服务类别
            value	String(20)	O	增值服务的值
            增值服务对照表：

            Code	name	Value
            CP0029	按需达	
            IN01	代收货款	代收金额
            IN02	保价	保价金额
            IN03	签单返还(纸质回单)	
            IN03	签回单	
            IN04	定时派送(等通知)	
            IN04	定时派送（等通知）	
            IN05	签收短信	
            IN07	报关服务	
            IN07	正式报关	
            IN07	进口报关	
            IN09	自取件	
            IN10	委托件	
            IN10	委托取件	
            IN100	资源调节	
            IN100	高峰资源调节费	
            IN101	原单转寄退回	
            IN101	原单退回	
            IN101	转寄/退回	
            IN102	特殊入仓	
            IN103	安装服务	
            IN104	高峰期附加费	
            IN105	签收确认服务	
            IN106	促销优惠	
            IN106	散单促销	
            IN109	到付现结优惠	
            IN109	快运到付现结优惠	
            IN11	指定时间派送	
            IN113	丰巢自寄优惠	
            IN116	宅配延伸	
            IN119	升舱次晨	
            IN121	准时保	
            IN123	参展服务	
            IN125	到柜服务	
            IN132	升舱服务	
            IN133	珍宝服务	
            IN137	出口报关	
            IN139	特派服务	
            IN139	直派服务	
            IN14	换包装	
            IN14	标准化包装服务	
            IN142	打包服务	
            IN143	丰卡速通	
            IN144	到齐再派	
            IN149	电子回单	
            IN15	燃油附加费	
            IN150	惊喜送达	
            IN152	木架拆卸服务	
            IN159	足额保	
            IN160	定额保	
            IN18	派件短信	
            IN200	乡镇派送服务	
            IN200	乡镇配送	
            IN200	其他服务（新）	
            IN200	外勤管理400	
            IN200	外勤管理500	
            IN200	外勤管理800	
            IN21	保价	
            IN21	基础保（高价值）	
            IN21	特安	
            IN23	超长超重服务	
            IN23	超长超重附加费	
            IN25	保价（台湾）	
            IN26	定时派送(指定时段)	
            IN26	定时派送（指定时段）	
            IN31	打木架	
            IN31	木质包装	
            IN41	保鲜服务	
            IN44	散单代收服务	
            IN45	送货上楼	
            IN45	送货上楼服务	
            IN45_0	上楼	
            IN45_0	上楼(有电梯)	
            IN52	验货服务	
            IN56	拍照验证	
            IN59	口令签收	
            IN59	密钥认证	
            IN59	签收确认	
            IN60	展会服务	
            IN60	撤展服务	
            IN65	装卸服务	
            IN65_0	装货	
            IN65_1	卸货	
            IN67	包装服务	
            IN73	上门收货	
            IN73	提货	
            IN73	提货服务	
            IN74	送货	
            IN74	送货服务	
            IN74	送货（不含上楼）	
            IN80	特殊出仓	
            IN87	保单配送	
            IN88	派件地址变更服务	
            IN89	优派服务	
            IN89	升舱次晨0930	
            IN89	升舱次晨（0930）	
            IN90	易碎件	
            IN91	拍照回传	
            IN91	电子图片	
            IN91	电子验收	
            IN95	集报散派	
            IN98	大件入户	
            IN98	大闸蟹专递	
            IN99	票据专送	
            OS03	入仓垫付费	
            OS04	丰巢超重费	
            OS06	产品优惠	
            OS06	快运产品优惠	
            OS09	电商退货超重费	
            OS09	超额现结费	
            OS11	收件微派	
            Fee

            属性名	参数类型	Required/Optional	描述
            feeName	String(100)	O	费用名
            feeTypeCode	String(100)	O	费用类型
            feeAmt	Number(10, 3)	O	费用
            paymentTypeCode	String(1)	O	支付方式
            paymentTypeName	String(100)	O	支付方式名
            settlementTypeCode	String(1)	O	结算类型
            settlementTypeName	String(100)	O	结算名称
            currencyCode	String(1)	O	费用单位
            currencyName	String(100)	O	费用单位名称
            Extend

            属性名	参数类型	Required/Optional	描述
            AUTO_FORWARDING_44_EMP_CODE	String(100)	O	自动转寄44操作码的员工编码
            AUTO_FORWARDING_44_EMP_MOBILE	String(100)	O	自动转寄44操作码员工手机号
            outerOrderNo	String(100)	O	客户订单号
            cargoValue	Number	O	货物价值
            Payable

            属性名	参数类型	Required/Optional	描述
            feeAmt	Number	R	金额（可能为负）
            feeName	String	O	费用名称
            feeTypeCode	String	R	费用代码
            下发参数示例

            {
              "addedServices": [
                {
                  "code": "IN67",
                  "name": "包装服务"
                }
              ],
              "cargoes": [
                {
                  "amount": "1",
                  "height": 30,
                  "length": 50,
                  "name": "大米",
                  "weight": 20.5,
                  "width": 20.5
                }
              ],
              "deliveryAddress": "55，57号一'二层[麦当劳餐厅]",
              "deliveryCity": "韶关市",
              "deliveryContact": "****",
              "deliveryCounty": "****",
              "deliveryPhone": "0751-8899285",
              "deliveryProvince": "广东省",
              "deliveryRemark": "",
              "deliveryTel": "0751-******",
              "deliveryType": 1,
              "deptCode": "755AD",
              "extend": {
                "mainLineCharge": 14.35,
                "priceType": 2,
                "pContractId": "79202309010002",
                "carrierType": 1,
                "pickLineCharge": 2.05,
                "dLineId": 1118709,
                "hasReceiverPayment": 0,
                "dContractId": "79202309010002",
                "destDistanceLabel": 2,
                "sapSupplierCode": "1003315590",
                "sapSupplierName": "东莞****",
                "deliverLineCharge": 0,
                "pLineId": 26708,
                "priceApplyType": 2,
                "routeType": 1,
                "sourceDistanceLabel": 1
              },
              "forwardOrderId": "202023092831510",
              "operateType": 0,
              "payables": [
                {
                  "feeAmt": 16.4,
                  "feeName": "运费",
                  "feeTypeCode": "1"
                },
                {
                  "feeAmt": -2,
                  "feeName": "安全服务费",
                  "feeTypeCode": "SAFETY_SERVE"
                }
              ],
              "pickUpAddress": "广东省深圳市龙岗区平湖街道华南大道一号华南城5号交易广场******",
              "pickUpCity": "深圳市",
              "pickUpContact": "顺丰小哥",
              "pickUpCounty": "龙岗区",
              "pickUpPhone": "0755-*****",
              "pickUpProvince": "广东省",
              "pickUpRemark": "",
              "pickUpTel": "0755-*****",
              "productCode": "SE0114",
              "receiverAddress": "55，57号一'二层[麦当劳餐厅]",
              "receiverCity": "韶关市",
              "receiverCityCode": "751",
              "receiverContact": "*****",
              "receiverCounty": "浈江区",
              "receiverPhone": "0751-******",
              "receiverProvince": "广东省",
              "receiverTel": "0751-889*****",
              "receiverType": 1,
              "subWaybillNos": "SF1443526969008",
              "totalCargoResume": "大米",
              "totalCargoVolume": 60000,
              "totalCargoWeight": 20.5,
              "totalPackageCount": 1,
              "waybillNo": "SF1443526969008"
            }
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_PUSH_FORWARD_PUSH_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardPushOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 订单状态上传
        /// 此接口用于第三方物流公司上传订单实时状态。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardUpdateOrderStatus(string partnerID, string checkword, MsgDataRequestForwardUpdateOrderStatus data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            forwardOrderId	Long(20)	R	SF快运转寄的订单号
            waybillNo	String(64)	R	运单号
            status	Int	R	订单状态
            remark	String(256)	0	备注
            operateTime	String(19)	O	变更时间 格式: yyyy-MM-dd HH:mm:ss
            operator	String(19)	O	操作人，可以是司机姓名或派件人姓名
            contact	String(20)	O	联系人 (可以是业务方联系人，或者区域经理等等）
            contactPhone	String(30)	O	联系人电话
            picUrls	List<String>	O	图片Urls；图片链接是外网可以访问的URL，系统通过异步方式抓取下来
            参数示例

            {
                "forwardOrderId":215151638454,
                "waybillNo":"SF45458785862",
                "status":2,
                "remark":"接单",
                "operateTime":"2019-06-21 15:15:00",
                "operator":"system",
                "contact"："杨生",
                "contactPhone":"19000000000"
            }
            状态值描述

            status值	含义	备注
            2	已接单	
            3	已流单	
            25	已指派	
            5	已提货	目前只要传这个状态
            55	已交接	
            6	运输中	
            7	派件中	
            75	审核中	
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            注意：在返回结果为false时，建议分情况重试。
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_UPDATE_ORDER_STATUS";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardUpdateOrderStatus>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 路由上传
        /// 承运商在处理运单的关键步骤(如装车、出运、卸车、开始派单、签收等），需要上传实时的路由状态。建议增量上传，每条路由信息必须要有唯一标识，以便判断是否重复。
        /// 不具备实时上传路由的承运商，可以定期上传。请确保每天至少上传3次路由或轨迹信息。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardUploadRouter(string partnerID, string checkword, MsgDataRequestForwardUploadRouter data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            waybillNo	String(64)	R	运单号。母单
            subWaybillNo	String(64)	O	子单号，选填，填了就是上传子单路由
            status	Int	R	面单当前签收状态 0在途中
            routerInfos	Array	R	路由描述信息list。建议按时间的倒序排列，增量上传。
            RouterInfo

            属性名	参数类型	Required/Optional	描述
            uniqueId	String(64)	R	路由信息的唯一识别码，系统用此字段判断是否重复。建议使用UUID，也可以使用context的hash作为去重的判断
            status	Int	R	路由发生时的面单状态。只能为0
            operator	String(30)	R	操作人员姓名或者工号
            operateTime	String(19)	R	发生时间。格式: yyyy-MM-dd HH:mm:ss。即该操作的发生时间，必须传实际时间，不能传上传时候的当前时间。
            context	String(200)	R	路由描述信息。 必须按照严格按照路由描述及解释 转译。避免出现收件、签收等给客户造成误解的描述
            cityName	String(20)	R	路由发生的城市
            provinceName	String(20)	R	路由发生的省份
            入参示例：

            {
                "waybillNo": "12345678",
                "subWaybillNo": "2345678",
                "status": 0,
                "routerInfos":
                [
                    {
                        "uniqueId": "2388561349448722724",
                        "status": 0,
                        "operator": "王大雷",
                        "operateTime": "2019-05-18 12:30:00",
                        "context": "广西壮族自治区贺州市八步区大宁镇公司岳** 派件中 派件员电话18877457789",
                        "cityName": "贺州市",
                        "provinceName": "广西省"
                    },
                    {
                        "uniqueId": "2388561349448722",
                        "status": 0,
                        "operator": "王大雷",
                        "operateTime": "2019-05-18 12:30:00",
                        "context": "广西省贺州市公司 已发出,下一站 广西壮族自治区贺州市八步区大宁镇",
                        "cityName": "贺州市",
                        "provinceName": "广西省"
                    }
                ]
            }
            路由描述及解释

            推送路由时，增量推送即可。一次可以推送多条。
            第三方物流公司的路由推送至顺丰，需回传的节点为所有的装车、卸车操作，以及派件出仓。签收节点不用传，请使用签收图片上传接口上传签收节点。
            详细规范如下：
            节点	描述	说明	例子
            装车	快件在【……】已装车，准备发往 【……】	如果是中转场，则“……”为“XX集散中心”，如果是营业部，则“……”为”XX市营业站”，XX为城市	快件在【泉州晋江集散中心】已装车，准备发往 【莆田黄石集散中心】
            出运	快件在【……】已出运	同上	快件在【泉州晋江集散中心】已出运
            卸车	快件到达 【……】	同上	快件到达 【莆田黄石集散中心】或 快件到达 【莆田市忠门营业站】
            派件出仓	快件交给合作伙伴收派员？？，正在派送途中（联系电话：**）	？？为收派员名称；******为收派员电话	快件交给合作伙伴****收派员庄志强，正在派送途中（联系电话：15959409941）
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_UPLOAD_ROUTER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardUploadRouter>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 轨迹上传
        /// 承运商需要上传货物的实时轨迹，建议每隔2小时推送实时轨迹（增量）。如果不具备实时轨迹的能力，可以定期或定点推送，但单个订单每日轨迹应该不少于2处。
        /// 此接口支持同一个运单的多条数据上传。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardUploadTrack(string partnerID, string checkword, MsgDataRequestForwardUploadTrack data, string environment = "bspgw")
        {
            /*
            请求参数
            属性名	参数类型	Required/Optional	描述
            waybillNo	String(64)	R	运单号
            timestamp	String(19)	R	时间点(是指发生时间）
            licensePlateNumber	String(32)	O	车牌号
            driver	String(32)	O	司机
            driverPhone	String(32)	O	司机电话
            province	String(20)	O	省
            city	String(20)	O	市
            county	String(20)	O	区
            address	String(256)	O	当前地址
            latitude	Number	O	当前纬度
            longitude	Number	O	当前经度
            elevation	Number	O	当前海拔
            latLongType	Int	O	坐标类型, 1:百度 2：高德 3：Google
            source	String(10)	R	位置信息来源。如人工维护、GPS、定点签到等
            remark	String(256)	O	备注信息
            traceType	Int	R	打卡类型：1.发车2.点到3.派送中
            入参示例

            {
                "waybillNo": "SF1223548122",
                "timestamp": 1561098516251,
                "licensePlateNumber": "粤B 888888",
                "driver": "李丰田",
                "driverPhone": "15985584758",
                "province": "广东省",
                "city": "深圳市",
                "county": "南山区",
                "address": "软件产业基地",
                "latitude": 22.62,
                "longitude": 114.07,
                "elevation": 10.52,
                "latLongType": 2,
                "source": "GPS",
                "remark": "",
                "traceType":2
            }
            返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码 详细错误代码列表参见：
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_UPLOAD_TRACK";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardUploadTrack>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 支付结果通知地址
        /// 如果运单已支付，会获取不到支付二维码，提示已支付
        /// </summary>
        /// <param name="body"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponseForwardPayNotify ForwardPayNotify(string body, out MsgDataRequestForwardPayNotify msgData)
        {
            /*
            SF->JYM 支付完成通知 客户扫二维码支付完成时，顺丰会通过这个接口通知供应商支付已完成。
            字段名	是否必须	类型	含义	备注
            waybillNo	Y	String	运单号	
            payStatus	Y	Int	支付状态	0 未支付 11 已支付
            outReqId	Y	String	支付流水号	可以用这个字段做幂等
            outSysCode	Y	String	指定编码	FOWD_LTL
            参数示例

            {
            “outSysCode”: “FOWD_LTL”,
            “outReqId”: “TSF1660016286047”,
            “payStatus”: 0,
            “finishedTime”: “2024-10-11 18:25:31”
            }

            返回参数

            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功, 返回”true”表示订单取消成功
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<ForwardPayNotifyRequest>(body);
                if (reqData != null)
                {
                    msgData = JsonHelper.DeserializeObject<MsgDataRequestForwardPayNotify>(reqData.msgData);
                    success = true;
                    errorMessage = "成功";
                }
                else
                {
                    msgData = null;
                    errorMessage = "接收内容为空！";
                }
            }
            else
            {
                msgData = null;
                errorMessage = "接收内容为空！";
            }
            return new MsgDataResponseForwardPayNotify()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 末端增加费用申请
        /// 使用场景：供应商派送的时候需要新增的费用时，可使用此接口发起费用新增的申请。目前只支持 入仓费
        /// Service Code: FOP_RECE_FORWARD_ADD_FEE_APPLY
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardAddFeeApply(string partnerID, string checkword, MsgDataRequestForwardAddFeeApply data, string environment = "bspgw")
        {
            /*
            入参字段:

            字段名	是否必须	类型	含义	备注
            waybillNo	Y	String	运单号	
            notSettableType	Y	Int	申请的费用类型	入仓垫付: 50
            reportImage	Y	String	图片证明的URL	外网可访问的图片地址
            reportRemark	N	String	备注	最多为500个字
            amount	Y	BigDecimal	异常金额	需要多加的费用
            返回字段

            字段名	是否必须	类型	含义	备注
            success	Y	Boolean	是否处理成功	
            errorCode	N	String	错误的时候可以返回错误码	
            errorMessage	N	String	错误原因 
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_ADD_FEE_APPLY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardAddFeeApply>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 费用申请审核状态通知 FOP_PUSH_FORWARD_ADD_FEE_NOTIFY
        /// 使用FOP_RECE_FORWARD_ADD_FEE_APPLY申请发起之后，审核通过或者不通过，通过该接口来接收结果
        /// </summary>
        /// <param name="body"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponseForwardAddFeeNotify ForwardAddFeeNotify(string body, out MsgDataRequestForwardAddFeeNotify msgData)
        {
            /*
            入参字段:
            字段名	是否必须	类型	含义	备注
            waybillNo	Y	String	运单号	
            notSettableType	Y	Int	申请的费用类型	入仓费: 50
            approvalStatus	Y	String	审核状态	审核状态:
            @1.已通过；
            @2.已驳回
            approvalContent	N	String	审核意见	
            返回字段：

            字段名	是否必须	类型	含义	备注
            success	Y	Boolean	是否处理成功	
            errorCode	N	String	错误的时候可以返回错误码	
            errorMessage	N	String	错误原因	
            obj	N	CreateOrderResponse	业务报文	
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<ForwardAddFeeNotifyRequest>(body);
                if (reqData != null)
                {
                    msgData = JsonHelper.DeserializeObject<MsgDataRequestForwardAddFeeNotify>(reqData.msgData);
                    success = true;
                    errorMessage = "成功";
                }
                else
                {
                    msgData = null;
                    errorMessage = "接收内容为空！";
                }
            }
            else
            {
                msgData = null;
                errorMessage = "接收内容为空！";
            }
            return new MsgDataResponseForwardAddFeeNotify()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 转寄回单下单
        /// 转寄单，回单下单接口
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardPlaceOrder(string partnerID, string checkword, MsgDataRequestForwardPlaceOrder data, string environment = "bspgw")
        {
            /*
            下回单（标快到付）

            Service_code:RFOP_RECE_FORWARD_PLACE_ORDER

            入参字段:

            字段名	是否必须	类型	含义	备注
            waybillNos	Y	List<String>	运单号	
            sendContact	Y	String	寄件人姓名	
            sendMobile	Y	String	寄件方手机号	
            sendProvince	Y	String	寄方省名称	
            sendCity	Y	String	寄方市名称	
            sendCounty	Y	String	寄方行政区名称	
            sendAddress	Y	String	寄方详细地址，不含省市区	
            返回字段
            字段名	是否必须	类型	含义	备注
            success	Y	Boolean	是否处理成功	
            errorCode	N	String	错误的时候可以返回错误码	
            errorMessage	N	String	错误原因	
            obj	N	CreateOrderResponse	业务报文
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_PLACE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardPlaceOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 上报异常
        /// 供应商在作业环节碰到货物破损、堵车等别的可能会影响交付质量或失效的情况下，可以通过这个接口上报异常
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardApplyOrderAB(string partnerID, string checkword, MsgDataRequestForwardApplyOrderAB data, string environment = "bspgw")
        {
            /*
            FOP_RECE_FORWARD_APPLY_ORDER_ABNORMAL ？
            入参字段：

            字段名	是否必须	类型	含义	备注
            supplierCode	是	String	转寄供应商编码	复磅类型异常时必须
            waybillNo	是	String	运单号	
            uploadTime	否	String	上传时间	
            uploadOperator	否	String	上传人	
            abnormalType	是	Integer	异常状态	0、装货交接，1、运输打卡，2、货物运达
            abnormalCode	是	String	异常编码	
            remark	否	String	异常描述	
            weight	否	String	重量	单位KG
            volume	否	String	体积	单位立方厘米
            delayDays	否	Integer	延迟天数	
            picUrl	否	String	图片URL	多图片以英文分号;分隔
            subVolume	否	List<FoOrderAbnormalApplySub>	子件异常类型	
            以下四种异常编码影响时效，入参中delayDays不能为空
            SIGN_05
            SIGN_03
            TRANSITING_15
            SIGN_15
            以下两种异常编码影响复磅，入参的weight以及subVolume(子件异常信息不能为空)
            HANDOVER_06
            TRANSITING_17
            abnormalCode异常编码有如下：

            字段	对应异常状态编码	异常阶段	备注
            HANDOVER_01	0	装货交接	货物损坏
            HANDOVER_06	0	装货交接	复磅申诉
            HANDOVER_07	0	装货交接	疫情管控时效延误
            HANDOVER_08	0	装货交接	货物多件/少件
            TRANSITING_10	1	运输打卡	货物损坏
            TRANSITING_12	1	运输打卡	疫情管控时效延误
            TRANSITING_13	1	运输打卡	货物多件/少件
            TRANSITING_14	1	运输打卡	堵车
            TRANSITING_15	1	运输打卡	事故/封路
            TRANSITING_16	1	运输打卡	违禁品
            TRANSITING_17	1	运输打卡	复磅申诉
            SIGN_01	2	货物运达	堵车/事故/封路/天气等延误
            SIGN_03	2	货物运达	客户地址周末或节假日停止办公/营业
            SIGN_04	2	货物运达	无法联系上客户
            SIGN_05	2	货物运达	经客户同意，更改派送时间
            SIGN_07	2	货物运达	经客户同意，更改派送地址
            SIGN_13	2	货物运达	疫情管控时效延误
            SIGN_14	2	货物运达	违禁品
            SIGN_15	2	货物运达	入仓排队影响，时效延误
            SIGN_17	2	货物运达	客户拒收快件
            SIGN_18	2	货物运达	客户要求自取且已通知客户
            FoOrderAbnormalApplySub

            字段名	是否必须	类型	含义	备注
            length	否	String	长，厘米	
            width	否	String	宽，厘米	
            height	否	String	高，厘米	
            quantity	否	Integer	件数	
            返回参数

            字段名	是否必须	类型	含义
            success	Y	Boolean	是否处理成功
            errorCode	N	String	错误的时候可以返回错误码
            errorMessage	N	String	错误原因
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_APPLY_ORDER_AB";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));


            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardApplyOrderAB>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 获取支付的二维码
        /// 如果运单已支付，会获取不到支付二维码，提示已支付
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="clientCode"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardStartPay(string partnerID, string clientCode, string checkword, MsgDataRequestForwardStartPay data, string environment = "bspgw")
        {
            /*
            请求参数
            字段名	Required/Optional	类型	含义
            msgData	R	String	运单对象信息
            clientCode	R	String	对接供应商的接入编码
            MsgData

            字段名	Required/Optional	类型	含义
            waybillNo	R	String	运单号
            supplierCode	R	String	供应商编码
            请求报文样例
            {“clientCode”:“YJMS”,
            “msgData”:"{“waybillNo”:“SF79202309010002”, “supplierCode”:“KYGYS201021001”}"
            }

            返回参数

            字段名	Required/Optional	类型	含义
            errorCode	R	String	错误代码
            errorMessage	R	String	错误描述
            success	R	String	是否成功
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_START_PAY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;
            content["clientCode"] = clientCode;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardStartPay>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 支付挂月结
        /// 把支付信息与月结卡号绑定扣费
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="clientCode"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardMonPay(string partnerID, string clientCode, string checkword, MsgDataRequestForwardMonPay data, string environment = "bspgw")
        {
            /*
            JYM->SF支付与月结卡绑定
            请求参数

            字段名	Required/Optional	类型	含义
            clientCode	R	String	供应商对接码
            requestId	R	String	随机编码uuid
            msgData	R	String	
            msgData
            字段名	Required/Optional	类型	含义
            waybillNo	R	String	运单号
            supplierCode	R	String	供应商编码
            monCode	O	String	月结卡号
            monCodeId	O	String	月结卡号id与月结卡号一个必填
            operator	R	String	操作人
            参数示例
            {
            “clientCode”:“FOP-FOWD-CORE-DELIVERY”,
            “requestId”:“bd8658024c5d4e668629a537eba6fbcb”,
            “msgData”:"{“waybillNo”:“SF1063783917175”, “supplierCode”:“KYGYS201021001”,“monCode”:“24500005”,“monCodeId”:“1254”,“operator”:“TA163653”}"
            }

            返回通用返回字段即可

            通用返回字段

            字段名	Required/Optional	类型	含义
            success	R	Boolean	是否处理成功
            errorCode	O	String	错误的时候可以返回错误码
            errorMessage	O	String	错误原因
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FORWARD_MON_PAY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));


            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;
            content["clientCode"] = clientCode;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseForwardMonPay>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success == true)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 分拣码
        /// 供应商可以把自己的分拣码通过API实时对接到顺丰面单上，以便提供使用顺丰面单直接分拣的功能。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="serviceAk">对应的ServiceAk</param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns>MsgDataResponseAddressReachableCheck</returns>
        public static JsonResult ForwardQueryLabel(string partnerID, string serviceAk, string checkword, MsgDataRequestForwardQueryLabel data, string environment = "bspgw")
        {
            /*
            字段名	是否必须	类型	含义
            partnerID	Y	String	直连供应商的接入码（供应商简称首字母拼接）
            serviceCode	Y	String	系统编码：FOP_PUSH_FORWARD_QUERY_LABEL
            ak	Y	String	对应的ServiceAk
            timestamp	Y	long	时间戳
            requestID	Y	String	唯一编码
            msgData	Y	String	参数
            msgData
            字段名	是否必须	类型	含义
            systemCode	Y	Boolean	系统来源
            supplierCode	Y	String	供应商编码
            waybillNo	Y	String	运单号
            customerNo	Y	String	月结卡号
            sourceProvince	Y	String	始发省
            sourceCity	Y	String	始发市
            sourceCityCode	Y	String	始发地3位城市编码
            sourceCounty	Y	String	始发区
            sourceAddress	Y	String	始发地址
            sourceDeptCode	Y	String	网点编码
            destProvince	Y	String	目的省
            destCity	Y	String	目的市
            destCityCode	Y	String	目的市三位城市编码
            destCounty	Y	String	目的区
            destAddress	Y	String	目的地址
            destDeptCode	Y	String	目的地网点编码
            productCode	Y	String	产品代码
            actualWeight	Y	String	实际重量，单位kg
            actualVolume	Y	String	实际体积，单位立方米
            返回字段
            字段名	是否必须	类型	含义
            successCode	Y	String	是否处理成功 A1000 成功
            apiErrorMsg	N	String	错误原因
            apiResultData	N	String	分拣码
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_PUSH_FORWARD_QUERY_LABEL";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));


            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            //content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;
            content["ak"] = serviceAk;

            var result = HttpHelper.GetResponseString(content, environment);
            if (!string.IsNullOrWhiteSpace(result))
            {
                var msgDataResponse = JsonHelper.DeserializeObject<ResponseForwardQueryLabel>(result);
                if (msgDataResponse != null)
                {
                    errmsg = msgDataResponse.apiErrorMsg;
                    resultdata = msgDataResponse.apiResultData;
                    if (msgDataResponse.successCode == "A1000")
                    {
                        errcode = "0";
                    }
                    else
                    {
                        errcode = msgDataResponse.successCode;
                    }
                }
                else
                {
                    errcode = "-2";
                    errmsg = "未返回业务数据";
                    resultdata = "";
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 转寄外发类

        #region 跨境大件类

        /// <summary>
        /// 给代理商下单 调用方 SF	接收方 CP
        /// 该接口用于顺丰快运给顺丰合作伙伴下订单，用于顺丰合作伙伴双清和结算的凭证。当客户确定走货后，顺丰快运将调用此接口。
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static MsgDataResponsePushI18nOrder PushI18nOrder(string body, out MsgDataRequestPushI18nOrder msgData)
        {
            /*
            1. 业务介绍
            跨境业务需要顺丰合作伙伴完成清关处理。顺丰合作伙伴完成 从国内报关开始，到境外的派送为止。

            这些流程环节需要顺丰合作伙伴提供除了下单入口以外，还需要回传 揽收的货物、货物尺寸、包裹的路由 等信息，另外如果不能提供回传包裹信息接口，就需要提供包裹查询接口。

            2. 接口清单
            #	接口名称	    Service Code	        调用方	接收方
            1	给代理商下单	FOP_PUSH_I18N_ORDER	    SF	    CP
            2	回传尺寸信息	FOP_RECE_I18N_DIMENSION	CP	    SF
            3	获取包裹详情	FOP_PUSH_I18N_PACKAGE	SF	    CP
            4	回传包裹详情	FOP_RECE_I18N_PACKAGE	CP	    SF
            3. 接口详细描述
            SF对接使用的是内部统一标准协议，协议参见《顺丰统一接入平台对接规范》。

            3.1 给代理商下单
            该接口用于顺丰快运给顺丰合作伙伴下订单，用于顺丰合作伙伴双清和结算的凭证。当客户确定走货后，顺丰快运将调用此接口。

            请求参数

            属性名	参数类型	Required/Optional	描述
            logisticID	String(20)	R	物流公司代码，SF代表顺丰
            requestID	String(40)	R	请求唯一号UUID
            serviceCode	String(50)	R	接口服务代码
            timestamp	long	R	调用接口时间戳
            msgDigest	String(128)	R	数字签名
            msgData		R	业务数据报文，参见**OrderRequest**
            OrderRequest 属性字段

            属性名	参数类型	Required/Optional	描述
            referenceNo	String(15)	R	关联的顺丰母单号
            receiver	Addr对象	R	收货信息，参见**Addr**
            quantity	Number(10)	R	下单件数
            cargos	Array	R	包裹明细， 参见**Cargo**
            productCode	String(50)	R	渠道名称
            customsType	String(20)	O	报关方式，参考附件2：物流服务枚举
            cargoType	Number(1)	R	货物类型，参考附件2：物流服务枚举
            taxContainType	Number(1)	O	包税类型，参考附件2：物流服务枚举
            shippingCode	String(20)	O	干线运输方式
            departCode	String(20)	O	启运地，参考附件2：物流服务枚举
            extraMap	Array<String, String>	O	扩展字段，包含key和value属性
            totalDeclaredValue	Number	O	申报总价值
            declaredValueCode	String(32)	O	申报总价值货币编码，参考附件2：物流服务枚举
            referenceId	String	O	货物追踪编号，德立信必填
            remark	String(200)	O	下单备注
            billFBADTOList	Array	O	FBA信息列表， 参见**[BillFBADTO]
            terminalCarrierCode	String(20)	O	派送方式
            warehouseCode	String(20)	O	仓库代码
            subWaybillNos	Array<String>	O	子单号
            subConsigns	Array	O	子包裹信息， 参见**[BillConsignDTO]
            Addr属性字段

            属性名	参数类型	Required/Optional	描述
            company	String(100)	O	公司名称
            contact	String(100)	R	联系人
            i18nAreaCode	String(10)	R	手机号国际电话区号
            mobile	String(20)	R	联系人手机号
            countryCode	String(10)	R	国家编码 ，参考附件1-收货国家/地区
            province	String(30)	O	省/州
            city	String(30)	R	城市
            county	String(30)	O	区
            address	String(200)	R	详细地址，收件类型是私人地址时必填
            postCode	String(20)	R	邮编
            warehouseCode	String(20)	O	FBA仓库编码，收件类型是FBA仓库必填
            Cargo 属性字段

            属性名	参数类型	Required/Optional	描述
            boxNo	String(30)	O	包裹号，一般为FBA箱号
            length	Number(16,2)	R	包裹长（cm），下单尺寸
            width	Number(16,2)	R	包裹宽（cm），下单尺寸
            height	Number(16,2)	R	包裹高（cm），下单尺寸
            weight	Number(16,2)	R	包裹重量(kg），下单尺寸
            SKU	String(200)	O	SKU
            englishName	String(200)	O	英文品名
            chineseName	String(200)	O	中文品名
            brand	String(200)	O	品牌
            model	String(200)	O	型号
            chineseMaterial	String(200)	O	中文材质
            englishMaterial	String(200)	O	英文材质
            purpose	String(200)	O	用途
            packing	String(200)	O	包装
            customsCode	String(20)	O	海关编码
            numberOfBoxes	String(20)	O	每箱个数
            declaredValue	BigDecimal	O	单个产品申报价值
            declaredTotalValue	BigDecimal	O	申报总价值
            extraMap	Array<String, String>	O	扩展字段，包含key和value属性
            salesURL	String(50)	O	销售链接
            BillFBADTO属性字段

            属性名	参数类型	Required/Optional	描述
            fbaNo	String(20)	O	FBA编号
            trackingNo	String(20)	O	货件追踪编号
            BillConsignDTO属性字段

            属性名	参数类型	Required/Optional	描述
            length	Number(16,2)	R	包裹长（cm），下单尺寸
            width	Number(16,2)	R	包裹宽（cm），下单尺寸
            height	Number(16,2)	R	包裹高（cm），下单尺寸
            weight	Number(16,2)	R	包裹重量(kg），下单尺寸
            SKU	String(200)	O	SKU
            englishName	String(200)	O	英文品名
            chineseName	String(200)	O	中文品名
            brand	String(200)	O	品牌
            model	String(200)	O	型号
            chineseMaterial	String(200)	O	中文材质
            englishMaterial	String(200)	O	英文材质
            purpose	String(200)	O	用途
            packing	String(200)	O	包装
            customsCode	String(20)	O	海关编码
            numberOfBoxes	String(20)	O	每箱个数
            declaredValue	BigDecimal	O	单个产品申报价值
            declaredTotalValue	BigDecimal	O	申报总价值
            salesURL	String(50)	O	销售链接
            附件1：收货国家/地区编码
            与大件跨境下单接口内附件一致https://open.sf-express.com/Api/ApiDetails?level3=728&interName=%E5%A4%A7%E4%BB%B6%E8%B7%A8%E5%A2%83%E4%B8%8B%E5%8D%95-FOP_RECE_IFOS_PLACE_ORDER

            字段	枚举
            收件国家/地区（持续补充中）

            receiverAddressDTO.country	AF(“阿富汗”)
            AL(“阿尔巴尼亚”)
            DZ(“阿尔及利亚”)
            AD(“安道尔共和国”)
            AU(“澳大利亚”)
            AT(“奥地利”)
            AZ(“阿塞拜疆”)
            BH(“巴林”)
            BD(“孟加拉国”)
            BY(“白俄罗斯”)
            BE(“比利时”)
            BT(“不丹”)
            BA(“波斯尼亚和黑塞哥维那”)
            BN(“文莱”)
            BG(“保加利亚”)
            KH(“柬埔寨”)
            CA(“加拿大”)
            HR(“克罗地亚”)
            CY(“塞浦路斯”)
            CZ(“捷克”)
            AT(“奥地利”),
            BE(“比利时”),
            CA(“加拿大”),
            DE(“德国”),
            GB(“英国”),
            GR(“希腊”),
            IT(“意大利”),
            JP(“日本”),
            RU(“俄罗斯”),
            US(“美国”),
            VN(“越南”)
            附件2：物流服务枚举
            与大件跨境下单接口内附件一致https://open.sf-express.com/Api/ApiDetails?level3=728&interName=%E5%A4%A7%E4%BB%B6%E8%B7%A8%E5%A2%83%E4%B8%8B%E5%8D%95-FOP_RECE_IFOS_PLACE_ORDER

            字段	枚举
            干线运输方式

            shippingCode	carrier_mason(“carrier_mason”, “美森正班快船”),
            carrier_mason_ad_hoc(“carrier_mason_ad_hoc”, “美森统配快船”), carrier_mason_timing(“carrier_mason_timing”, “美森定时达”),
            carrier_zim(“carrier_zim”, “以星快船”),
            carrier_evergreen(“carrier_evergreen”, “长荣快船”),
            carrier_general(“carrier_general”, “海运普船”),
            air_line(“air_line”, “空运专线”),
            carrier_fixed_pick_up(“carrier_fixed_pick_up”, “普船定提”),
            carrier_general_express(“carrier_general_express”, “普船快线”)。
            付款方式

            settlementTypeCode	1(“寄付现结”),
            2(“寄付月结”)
            收货地址类型

            receiverType	1(“FBA仓库”),
            2(“非FBA地址”)
            货物类型

            cargo.cargoType	1(“普货”),
            2(“电池货物”)
            3(“带磁货物”)
            4(“带磁带电货物”)
            申报总价值货币编码

            declaredValueCode	CNY(“人民币”),
            USD(“美元”)
            HKD(“港币”)
            EUR(“欧元”)
            产品类型

            productType	A100(“FBA跨境特快”)
            A101(“FBA跨境标快”)
            S100(“FBA跨境快船”)
            S101(“FBA跨境普船”)
            S103(“跨境整柜”)
            L100(“跨境卡航”)
            L101(“跨境中欧班列”)
            T100(“海运标快”)
            S108(“跨境超大件-快船”)
            S109(“跨境超大件-普船”)
            报关方式

            customsType	agent_declear(“非报关件”),
            customer_declear(“出口正式报关”)
            派送方式

            terminalCarrierCode	UPS(“UPS”),
            FEDEX(“FEDEX”)
            DHL(“DHL”)
            express(“快递”)
            Trucking(“卡车”)
            NULL(“无”)
            清关方式

            taxContainType	1(“关税预付”),
            2(“关税不预付”)
            3(“PVA递延”)
            启运地

            departCode	86(“大陆飞”)
            852(“香港飞”)
            申报总价值货币编码

            declaredValueCode	CNY(“人民币”)
            USD(“美元”)
            HKD(“港币”)
            EUR(“欧元”)
            货物类型

            cargoType	1(“普货”)
            2(“电池货物”)
            3(“带磁货物”)
            4(“带磁带电货物”)
            请求数据示例：

            POST https://<cp服务域名>/<服务path> HTTP/1.1
            Content-Type: application/x-www-form-urlencoded;charset=UTF-8

            logisticID=SF&requestID=requestID&serviceCode=FOP_PUSH_I18N_ORDER&timestamp=112500000&msgDigest=msgDigest&nonce=4678965&msgData={"cargoType":3,"cargos":[{"boxNo":"FBA17XXTLC12U000001","brand":"无","chineseMaterial":"橡胶","chineseName":"遮雨挡","customsCode":"3926300000","declaredTotalValue":192.0000000000,"declaredValue":2.3,"englishMaterial":"Rubber","englishName":"Rain-proof rubber baffle","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"20","packing":"纸箱","purpose":"挡雨","weight":13.800,"width":41.0000},{"boxNo":"FBA17XXTLC12U000002","brand":"无","chineseMaterial":"塑料","chineseName":"卡扣","customsCode":"3917400000","declaredTotalValue":39.0000000000,"declaredValue":1.3,"englishMaterial":"Plastic","englishName":"Buckle","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"30","packing":"纸箱","purpose":"紧固","weight":8.900,"width":41.0000},{"boxNo":"FBA17XXTLC12U000003","brand":"无","chineseMaterial":"铁","chineseName":"脚踏板","customsCode":"8452901900","declaredTotalValue":60.0000000000,"declaredValue":1.5,"englishMaterial":"Iron","englishName":"Footpedal","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"40","packing":"纸箱","purpose":"刹车","weight":17.500,"width":41.0000},{"boxNo":"FBA17XXTLC12U000004","brand":"无","chineseMaterial":"铁","chineseName":"喇叭","customsCode":"8512100000","declaredTotalValue":36.0000000000,"declaredValue":1.8,"englishMaterial":"Iron","englishName":"Trumpet","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"20","packing":"纸箱","purpose":"发声，震动","weight":12.600,"width":41.0000},{"boxNo":"FBA17XXTLC12U000005","brand":"无","chineseMaterial":"铁","chineseName":"喇叭","customsCode":"8512100000","declaredTotalValue":18.0000000000,"declaredValue":1.8,"englishMaterial":"Iron","englishName":"Trumpet","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"10","packing":"纸箱","purpose":"发声，震动","weight":12.400,"width":41.0000},{"boxNo":"FBA17XXTLC12U000006","brand":"无","chineseMaterial":"塑料","chineseName":"杯架","customsCode":"3924100000","declaredTotalValue":24.0000000000,"declaredValue":1.2,"englishMaterial":"Plastic","englishName":"Cupholder","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"20","packing":"纸箱","purpose":"隔热","weight":7.300,"width":41.0000},{"boxNo":"FBA17XXTLC12U000007","brand":"无","chineseMaterial":"塑料","chineseName":"装饰盖","customsCode":"3926400000","declaredTotalValue":30.0000000000,"declaredValue":1.5,"englishMaterial":"Plastic","englishName":"Decorativelid","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"20","packing":"纸箱","purpose":"密封","weight":15.300,"width":41.0000},{"boxNo":"FBA17XXTLC12U000008","brand":"无","chineseMaterial":"ABS 塑料 玻璃","chineseName":"化妆镜","customsCode":"8306300000","declaredTotalValue":36.0000000000,"declaredValue":1.8,"englishMaterial":"ABS plastic, glass","englishName":"Makeup Mirror","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"20","packing":"纸箱","purpose":"反射","weight":5.300,"width":41.0000},{"boxNo":"FBA17XXTLC12U000009","brand":"无","chineseMaterial":"塑料","chineseName":"车钩","customsCode":"8607300000","declaredTotalValue":66.0000000000,"declaredValue":2.2,"englishMaterial":"Plastic","englishName":"Couplers","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"30","packing":"纸箱","purpose":"挂物品","weight":19.500,"width":41.0000},{"boxNo":"FBA17XXTLC12U000010","brand":"无","chineseMaterial":"塑料","chineseName":"解码器","customsCode":"8471419000","declaredTotalValue":130.0000000000,"declaredValue":2.6,"englishMaterial":"Plastic","englishName":"Decoder","height":41.0000,"length":51.0000,"model":"无","numberOfBoxes":"50","packing":"纸箱","purpose":"消除信号干扰","weight":15.700,"width":41.0000}],"customsType":"agent_declear","declaredValueCode":"USD","departCode":"86","productCode":"深圳UPS5000(红单服务）","quantity":10,"receiver":{"city":"Los Angeles","company":"","contact":"AMAZON.COM","countryCode":"US","mobile":"DEEQAVTiWCKqwAlMtYYanMzfldwds%3D","postCode":"91321","province":"California","warehouseCode":"XLX3"},"referenceId":"","referenceNo":"SF1310231623996","remark":"","totalDeclaredValue":631.000000}
            响应参数

            ** 属性字段**

            属性名	参数类型	Required/Optional	描述
            errorCode	String(20)	R	错误编码
            errorMessage	Array<String>	O	错误信息
            success	boolean	R	是否成功：true或者false
            obj	String	R	业务处理详细结果，参见**OrderResponse**
            OrderResponse 属性字段

            属性名	参数类型	Required/Optional	描述
            orderNo	String(20)	R	订单号
            subNos	Array<String>	O	子单号列表
            referenceNo	String(20)	O	查单号，查单根据这个标识来查
            响应数据示例：

            Content-Type: application/json; charset=utf-8

            {
                "errorCode": null,
                "errorMessage": null,
                "obj": {
                    "orderNo": "orderNo",
                    "subNos": [
                        "subNo"
                    ],
                    "referenceNo": ""
                },
                "success": true
            }
            注意事项
            1、根据顺丰母单号referenceNo做幂等。如果已经下过单了，不要报错，直接返回你们的运单信息。因为这个接口有时效性，如果你的下单接口没有在指定时间内返回，我们就认为失败了，然后会重推。
            2、测试环境联调信息：客户编码：API_ON_SHELVES，校验码：1IMROMBJLN16SJSMEZZJKE5TGAL25HIA（若是校验数字签名时需要用到）
            2、通讯双方采用 http POST 方法作为通讯协议，请求头必须添加：Content-type: application/json;charset=UTF-8，字符集编码统一使用 UTF-8。 
            */

            bool success = false;
            string errorCode = "";
            string errorMessage = "";
            PushI18nOrderObj obj = new PushI18nOrderObj();

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<PushI18nOrderRequest>(body);
                if (reqData != null)
                {
                    msgData = reqData.msgData;
                    success = true;
                    obj.orderNo = ""; //这个订单号要怎么生成？待研究。。。
                    obj.referenceNo = msgData.referenceNo;
                    obj.subNos = msgData.subWaybillNos;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new MsgDataResponsePushI18nOrder() {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage,
                obj = obj
            };
        }

        /// <summary>
        /// 箱单发票上传 FOP_RECE_IFOS_ATTACHMENT_ADD
        /// 本接口用于运单箱单发票上传
        /// </summary>
        /// <param name="waybillNo"></param>
        /// <param name="clientCode">文件路径</param>
        /// <param name="file"></param>
        /// <returns></returns>
        public static JsonResult IfosAttachmentAdd(string waybillNo, string clientCode, string file)
        {
            /* 
            2.1. 请求地址：
            https://fop.sf-express.com/restApi/ifosOrderService/fop-app-fca/order/packing/attachment/add

            2.2. 接口基本信息
            名称	值
            客户编码	FOP-IFOS-CORE
            批量上传	不支持
            参数类型	form-data
            2.3.请求参数
            属性名	参数类型	Required/Optional	描述
            waybillNo	String(32)	R	运单号
            clientCode	String(32)	R	客户编码
            digest	String(32)	R	Base64(MD5 (waybillNo+clientCode) )
            file	MultipartFile	R	上传文件
            2.4.返回参数
            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            obj	Obj	O	业务对象
            响应示例

            {
                "errorCode": "0",
                "errorMessage": "success",
                "obj": null,
                "success": true
            }
            */

            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            //string serviceCode = "FOP_RECE_IFOS_ATTACHMENT_ADD";
            string digest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(waybillNo + clientCode));

            string postData = JsonHelper.SerializeObject(new
            {
                waybillNo = waybillNo,
                clientCode = clientCode,
                digest = digest
            });

            var fileDictionary = new Dictionary<string, string>();
            fileDictionary["file"] = file;

            var result = HttpHelper.GetResponseFop(postData, fileDictionary);
            if (result != null)
            {
                errmsg = result.errorMessage;
                if (result.success)
                {
                    errcode = "0";
                }
                else
                {
                    errcode = result.errorCode;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 代理商上报轨迹
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="clientCode"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult I18nTraceReport(string partnerID, string checkword, string clientCode, MsgDataRequestI18nTraceReport data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	FOP_RECE_I18N_TRACE_REPORT
            批量交易	不支持
            接口类型	接入
            报文类型	JSON
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（FOP_RECE_I18N_TRACE_REPORT）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            8	clientCode	String	是	操作人，代理商简称，比如：TWTH
            2.3. 请求参数
            msgData

            属性名	必填	类型	描述
            referenceNo	是	string	顺丰母单号
            routes	是	array	动态路由信息，顺序全部以降序存放，参见 Route
            baseRoutes	是	array	基本路由信息，参见 BaseRoute
            Route

            属性名	必填	类型	描述
            opTime	是	Long	操作时间
            opDesc	是	string	操作描述(路由文本内容)
            mileStone	否	string	里程碑，详见里程碑
            BaseRoute

            属性名	必填	类型	描述
            serviceType	否	String	业务类型[TransferNo:转单号；ShipNo:船名+预计时间；FlightNo:航班]
            transferNo	否	string	转单号。业务类型为TransferNo时必填
            shipNo	否	string	船名。业务类型为ShipNo时必填
            flightNo	否	string	航班。业务类型为FlightNo时必填
            etd	否	string	预计离岸时间，格式为YYYY-MM-DD hh:mm:ss
            eta	否	string	预计到岸时间，格式为YYYY-MM-DD hh:mm:ss
            里程碑
            共 9 个状态，是枚举集合，各状态表示物流事件发生过的情况，里程碑可以表达事件发生的历史过程。

            枚举值	描述
            InfoReceived	收到信息，运输商收到商家的下单信息，等待上门取件。
            PickedUp	揽收，运输商收取商家的包裹。
            Departure	离港，离开发件国港口
            Arrival	到港，到达收件国港口
            AvailableForPickup	到达待取，包裹已经到达目的地的投递点，需要收件人自取。
            OutForDelivery	派送途中，包裹正在投递过程中。
            Delivered	成功签收，包裹已妥投。
            Returned	退件，包裹已经完成退件操作。
            Returning	退件中，包裹在处理，但不保证处理完会转成"退件"状态。
            成功返回示例的参数说明
            参数名	类型	说明
            errorCode	string	错误编码
            errorMessage	string	错误信息
            success	string	是否成功，成功true，失败false
            请求报文 （msgData字段）:

            {
                "partnerID": "FZWLNPBHWDG",
                "requestID": "f349d15e-e624-8061-1d27-98a5cd32c297",
                "serviceCode": "FOP_RECE_IFOS_PLACE_ORDER",
                "timestamp": 1721705500,
                "msgDigest": "",
                "accessToken": "5FF1ADD662114F25B3A8D2BBDF21EF8C",
                "clientCode": "TWTH",
                "msgData": {
                    "referenceNo": "SF3110000439558",
                    "routes": [
                        {
                            "opTime": 1721957046000,
                            "opDesc": "订单创建",
                            "mileStone": "InfoReceived"
                        },
                        {
                            "opTime": 1721995283000,
                            "opDesc": "已入库",
                            "mileStone": "PickedUp"
                        },
                        {
                            "opTime": 1722421441000,
                            "opDesc": "已装柜",
                            "mileStone": null
                        },
                        {
                            "opTime": 1722421602000,
                            "opDesc": "已出库",
                            "mileStone": null
                        },
                        {
                            "opTime": 1722422990000,
                            "opDesc": "船名航次：OOCL BANGKOK 061E ，起运港：盐田 目的港：纽约",
                            "mileStone": null
                        },
                        {
                            "opTime": 1722423008000,
                            "opDesc": "ETD8-04 ETA9-03",
                            "mileStone": null
                        },
                        {
                            "opTime": 1722499874000,
                            "opDesc": "8-01已报关放行",
                            "mileStone": null
                        },
                        {
                            "opTime": 1722736260000,
                            "opDesc": "8-04已开航",
                            "mileStone": "Departure"
                        },
                        {
                            "opTime": 1725412920000,
                            "opDesc": "9-04已到港，待卸船",
                            "mileStone": "Arrival"
                        },
                        {
                            "opTime": 1725413880000,
                            "opDesc": "9-04已清关放行",
                            "mileStone": null
                        },
                        {
                            "opTime": 1725585480000,
                            "opDesc": "9-06已卸船",
                            "mileStone": null
                        },
                        {
                            "opTime": 1725846360000,
                            "opDesc": "9-09已提柜",
                            "mileStone": null
                        }
                    ],
                    "baseRoutes": [
                        {
                            "serviceType": "TransferNo",
                            "transferNo": "1Z8123456789"
                        },
                        {
                            "serviceType": "ShipNo",
                            "shipNo": "OOCL BANGKOK 061E",
                            "etd": "2024-08-04 00:00:00",
                            "eta": "2024-09-03 00:00:00"
                        }
                    ]
                }
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

             {
                "business": null,
                "date": 1726041376104,
                "errorCode": null,
                "errorMessage": null,
                "obj": null,
                "success": true
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_I18N_TRACE_REPORT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;
            content["clientCode"] = clientCode;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseI18nTraceReport>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大件跨境下单
        /// 用于大件跨境下单
        /// 下大件跨境运单:
        /// ● 客户系统向顺丰大件跨境下单。
        /// ● 返回母单子单号。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IfosPlaceOrder(string partnerID, string checkword, MsgDataRequestIfosPlaceOrder data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	FOP_RECE_IFOS_PLACE_ORDER
            批量交易	不支持
            接口类型	接入
            报文类型	表单
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（FOP_RECE_IFOS_PLACE_ORDER）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            属性名	必填	类型	描述
            vatRegisterNo	否	string	VAT注册号
            vatRegisterCompany	否	string	VAT注册公司名称
            vatRegisterCompanyAddr	否	string	VAT注册公司地址
            EORI	否	string	EORI
            amazonReferanceID	否	string	Amazon referance ID（=追踪编号）
            settlementTypeCode	是	string	付款方式：1寄付现结 2寄付月结
            customerAccount	否	string	月结卡号(寄付月结则必填)
            invoiceFile	否	object	装箱单发票（建议线下交接）
            invoiceFile.objectName	否	string	装箱单发票ossid （不传）
            invoiceFile.originalFilename	否	string	装箱单发票文件名称 （不传）
            receiverType	是	string	收件地址类型

            （1.FBA仓库，2.非FBA地址）
            warehouseCode	否	string	FBA仓库编码(收件类型是FBA仓库必填)
            receiverAddressDTO	是	object	收货人信息
            receiverAddressDTO.address	否	string	收件详细地址（收件类型是非FBA地址必填)
            receiverAddressDTO.city	否	string	收件地址城市
            receiverAddressDTO.company	否	string	收件人公司名称
            receiverAddressDTO.contact	否	string	收件地址联系人（收件类型是非FBA地址必填)
            receiverAddressDTO.country	是	string	收件国家/地区，见备注枚举
            receiverAddressDTO.countryCode	是	string	收件国家/地区代码，见备注枚举
            receiverAddressDTO.mobile	否	string	收件人手机号(非FBA，则必填)
            receiverAddressDTO.postCode	否	string	收件地址邮编 (非FBA，则必填)
            receiverAddressDTO.province	否	string	收件地址省份
            senderAddressDTO	是	object	发货人信息
            senderAddressDTO.address	是	string	发货人详细地址
            senderAddressDTO.contact	是	string	发货联系人
            senderAddressDTO.company	否	string	发货公司名称
            senderAddressDTO.province	是	string	发货地址省份（中文）
            senderAddressDTO.provinceCode	否	string	发货地址省份代码
            senderAddressDTO.city	是	string	发货地址城市（中文）
            senderAddressDTO.cityCode	否	string	发货地址城市编码
            senderAddressDTO.county	是	string	发货地址区县（中文）
            senderAddressDTO.countyCode	否	string	发货地址区县编码
            senderAddressDTO.mobile	是	string	发货人手机号
            fbaNos	否	array	FBA编号列表
            cargo	是	object	货物对象
            cargo.cargoName	否	string	货物名称
            cargo.cargoType	是	string	货物类型

            1.普货，2.带电，3.带磁，4.带磁带电
            totalDeclaredValue	是	number	申报总价值
            declaredValueCode	是	string	申报总价值货币编码

            CNY.人民币，USD.美元，HKD.港币，EUR.欧元
            productType	是	string	产品类型，见备注枚举
            customsType	是	string	报关方式：

            agent_declear 非报关件，customer_declear 出口正式报关
            customsFiles	否	array	报关文件（报关方式为出口正式报关时，需要线下交接该文件）
            customsFiles.objectName	否	string	报关文件ossid
            customsFiles.originalFilename	否	string	报关文件名称
            taxContainType	否	string	清关方式：

            1-关税预付，2-关税不预付 ，3 PVA递延
            declaredValue	是	string	投保金额
            pickupMode	是	int	国内运输方式，

            1. 客户自送 ，2 上门接货，3.其他方式上门接货
            collectionTm	否	date	其他方式上门接货-预约上门揽收时间
            collectionRemark	否	string	其他方式上门接货-预约上门揽收备注
            domesticCourierNumber	否	string	客户自送-自送单号
            domesticCourierCode	否	string	客户自送-自送供应商编码，见备注
            remark	否	string	客户备注
            exclusiveEmpNo	否	string	专属揽收小哥工号
            terminalCarrierCode	否	string	派送方式，枚举见备注
            departCode	否	string	启运地，枚举见备注

            A100/A101时必填
            shippingCode	否	string	干线运输方式，见备注枚举

            S100/S101/S108/S109时必填
            packages	是	array	下单箱单尺寸
            packages.boxNo	是	string	箱号（填写FBA编号或阿拉伯数字）
            packages.packageHigh	是	string	包裹高cm
            packages.packageLong	是	string	包裹长cm
            packages.packageWeight	是	string	包裹重量kg（实重）
            packages.packageWidth	是	string	包裹宽cm
            packages.SKU	否	string	SKU
            packages.englishName	否	string	英文品名
            packages.chineseName	否	string	中文品名
            packages.brand	否	string	品牌
            packages.model	否	string	型号
            packages.chineseMaterial	否	string	中文材质
            packages.englishMaterial	否	string	英文材质
            packages.purpose	否	string	用途
            packages.packing	否	string	包装
            packages.customsCode	否	string	海关编码
            packages.numberOfBoxes	否	string	每箱个数
            packages.declaredValue	否	string	单个产品申报价值
            packages.declaredTotalValue	否	string	申报总价值
            packages.salesLink	否	string	销售链接
            packages.pic	否	string	图片
            userAppKey	否	string	下单来源，系统编码
            username	是	string	用户下单账号（手机号）
            customerReferenceNo	是	string	客户订单号Id,须保证订单号唯一。
            sendTm	否	date	送达时间
            成功返回示例的参数说明
            参数名	类型	说明
            business	object	无
            date	string	无
            errorCode	string	无
            errorMessage	string	无
            obj	object	无
            obj.waybillNo	string	母单号
            obj.subWaybillNo	string	子单号
            params	array	无
            requestId	string	无
            success	string	无
            version	string	无
            请求报文 （msgData字段）:

            {
                "settlementTypeCode": "2",
                "customerAccount": "7553033327",
                "receiverType": 1,
                "warehouseCode": "XUSE",
                "receiverAddressDTO": {
                      "country":"US",
                      "countryCode":"US"
                 },
                "senderAddressDTO": {
                    "address": "丰泰产业园6楼",
                    "contact": "赵明",
                    "company": "",
                    "province": "北京市",
                     "city": "北京市",
                    "county": "顺义区",
                    "mobile": "18888888888"
                },
                "fbaNos": [
                    "FBA16XPGJB87"
                ],
                "cargo": {
                    "cargoName": "",
                    "cargoType": 1
                },
                "totalDeclaredValue": 645,
                "productType": "A100",
                "customsType": "agent_declear",
                "declaredValue": "32323",
                "pickupMode": 2,
                "remark": "",
                "terminalCarrierCode": "DHL",
                "departCode": "86",
                "shippingCode": "carrier_mason",
                "domesticCourierNumber": "",
                "domesticCourierCode": "",
                "customsFiles": [],
                "packages": [
                    {
                        "boxNo": "FBA16XPGJB87U000001",

                        "packageHigh": 35,
                        "packageLong": 47,

                        "packageWeight": 14,
                        "packageWidth": 41

                    },
                    {
                        "boxNo": "FBA16XPGJB87U000002",

                        "packageHigh": 35,
                        "packageLong": 47,

                        "packageWeight": 14,
                        "packageWidth": 41
                    } 
                ],
                "declaredValueCode": "USD",
                "username":"15273286698",
                "customerReferenceNo":"SFGH55"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
             {
                "business": null,
                "date": "",
                "errorCode": "",
                "errorMessage": "",
                "obj": {
                    "id": "",
                    "subWaybillNo": "SF1011865168974,SF2010303774310",
                    "warningMsg": "",
                    "waybillNo": "SF1011865168974"
                },
                "params": [],
                "requestId": "",
                "success": true,
                "version": ""
            }
            失败报文-范例1
            {
                "success":false,
                "errorCode":"8016",
                "errorMsg":"重复下单",
                "msgData":null
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            字段	枚举
            收件国家/地区（持续补充中）

            receiverAddressDTO.country	AF(“阿富汗”)
            AL(“阿尔巴尼亚”)
            DZ(“阿尔及利亚”)
            AD(“安道尔共和国”)
            AU(“澳大利亚”)
            AT(“奥地利”)
            AZ(“阿塞拜疆”)
            BH(“巴林”)
            BD(“孟加拉国”)
            BY(“白俄罗斯”)
            BE(“比利时”)
            BT(“不丹”)
            BA(“波斯尼亚和黑塞哥维那”)
            BN(“文莱”)
            BG(“保加利亚”)
            KH(“柬埔寨”)
            CA(“加拿大”)
            HR(“克罗地亚”)
            CY(“塞浦路斯”)
            CZ(“捷克”)
            AT(“奥地利”),
            BE(“比利时”),
            CA(“加拿大”),
            DE(“德国”),
            GB(“英国”),
            GR(“希腊”),
            IT(“意大利”),
            JP(“日本”),
            RU(“俄罗斯”),
            US(“美国”),
            VN(“越南”)
            干线运输方式

            shippingCode	carrier_mason(“carrier_mason”, “美森正班快船”),
            carrier_mason_ad_hoc(“carrier_mason_ad_hoc”, “美森统配快船”), carrier_mason_timing(“carrier_mason_timing”, “美森定时达”),
            carrier_zim(“carrier_zim”, “以星快船”),
            carrier_evergreen(“carrier_evergreen”, “长荣快船”),
            carrier_general(“carrier_general”, “海运普船”),
            air_line(“air_line”, “空运专线”),
            carrier_fixed_pick_up(“carrier_fixed_pick_up”, “普船定提”),
            carrier_general_express(“carrier_general_express”, “普船快线”)。
            付款方式

            settlementTypeCode	1(“寄付现结”),
            2(“寄付月结”)
            收货地址类型

            receiverType	1(“FBA仓库”),
            2(“非FBA地址”)
            货物类型

            cargo.cargoType	1(“普货”),
            2(“电池货物”)
            3(“带磁货物”)
            4(“带磁带电货物”)
            申报总价值货币编码

            declaredValueCode	CNY(“人民币”),
            USD(“美元”)
            HKD(“港币”)
            EUR(“欧元”)
            产品类型

            productType	A100(“FBA跨境特快”)
            A101(“FBA跨境标快”)
            S100(“FBA跨境快船”)
            S101(“FBA跨境普船”)
            S103(“跨境整柜”)
            L100(“跨境卡航”)
            L101(“跨境中欧班列”)
            T100(“海运标快”)
            S108(“跨境超大件-快船”)
            S109(“跨境超大件-普船”)
            报关方式

            customsType	agent_declear(“非报关件”),
            customer_declear(“出口正式报关”)
            国内运输方式

            pickupMode	1(“客户自送”),
            2(“上门接货”)
            3(“其他方式上门接货”)
            派送方式

            terminalCarrierCode	UPS(“UPS”),
            FEDEX(“FEDEX”)
            DHL(“DHL”)
            express(“快递”)
            Trucking(“卡车”)
            NULL(“无”)
            清关方式

            taxContainType	1(“关税预付”),
            2(“关税不预付”)
            3(“PVA递延”)
            启运地

            departCode	86(“大陆飞”)
            852(“香港飞”)
            客户自送供应商编码

            domesticCourierCode	LTL(“LTL”, “零担”),
            HLL(“HLL”, “货拉拉” ),
            SF(“SF”, “顺丰速运”),
            HTKY(“HTKY”, “百世快递”),
            ZTO(“ZTO”, “中通快递”),
            STO(“STO”, “申通快递”),
            YTO(“YTO”, “圆通速递”),
            YD(“YD”, “韵达速递”),
            YZPY(“YZPY”, “邮政快递包裹”),
            EMS(“EMS”, “EMS”),
            HHTT(“HHTT”, “天天快递”),
            JD(“JD”, “京东物流”),
            QFKD(“QFKD”, “全峰快递”),
            GTO(“GTO”, “国通快递”),
            UC(“UC”, “优速快递”),
            DBL(“DBL”, “德邦”),
            FAST(“FAST”, “快捷快递”),
            ZJS(“ZJS”, “宅急送”),
            AJ(“AJ”, “安捷快递”),
            ALKJWL(“ALKJWL”, “阿里跨境电商物流”),
            AXWL(“AXWL”, “安讯物流”),
            AYUS(“AYUS”, “安邮美国”),
            AMAZON(“AMAZON”, “亚马逊物流”),
            AOMENYZ(“AOMENYZ”, “澳门邮政”),
            ANE(“ANE”, “安能物流”),
            AXD(“AXD”, “安信达快递”),
            ADD(“ADD”, “澳多多”),
            AYCA(“AYCA”, “澳邮专线”),
            BDT(“BDT”, “八达通 “),
            BETWL(“BETWL”, “百腾物流”),
            BJXKY(“BJXKY”, “北极星快运”),
            BLZ(“BLZ”, “巴伦支快运”),
            BNTWL(“BNTWL”, “奔腾物流”),
            BFDF(“BFDF”, “百福东方”),
            BHGJ(“BHGJ”, “贝海国际 “),
            BQXHM(“BQXHM”, “北青小红帽”),
            BFAY(“BFAY”, “八方安运”),
            BTWL(“BTWL”, “百世快运”),
            CCES(“CCES”, “CCES快递”),
            CFWL(“CFWL”, “春风物流”),
            CHTWL(“CHTWL”, “诚通物流”),
            CKY(“CKY”, “出口易”),
            CXHY(“CXHY”, “传喜物流”),
            CG(“CG”, “程光 “),
            CITY100(“CITY100”, “城市100”),
            CJKD(“CJKD”, “城际快递”),
            CNPEX(“CNPEX”, “CNPEX中邮快递”),
            COE(“COE”, “COE东方快递”),
            CSCY(“CSCY”, “长沙创一”),
            CDSTKY(“CDSTKY”, “成都善途速运”),
            CTG(“CTG”, “联合运通”),
            CBO(“CBO”, “CBO钏博物流”),
            DSWL(“DSWL”, “D速物流”),
            DLG(“DLG “, “到了港”),
            D4PX(“D4PX”, “递四方速递”),
            DTWL(“DTWL”, “大田物流”),
            DJKJWL(“DJKJWL”, “东骏快”),
            DEKUN(“DEKUN”, “德坤”),
            ETK(“ETK”, “E特快”),
            EWE(“EWE”, “EWE”),
            FEDEX(“FEDEX”, “FEDEX联邦(国内件）”),
            FEDEX_GJ(“FEDEX_GJ”, “FEDEX联邦(国际件）”),
            CRAZY(“CRAZY”, “疯狂快递”),
            FKD(“FKD”, “飞康达”),
            FTD(“FTD”, “富腾达 “),
            GD(“GD”, “冠达 “),
            GDEMS(“GDEMS”, “广东邮政”),
            GSD(“GSD”, “共速达”),
            GTONG(“GTONG”, “广通 “),
            GAI(“GAI”, “迦递快递”),
            GKSD(“GKSD”, “港快速递”),
            GTSD(“GTSD”, “高铁速递”),
            HFWL(“HFWL”, “汇丰物流”),
            HGLL(“HGLL”, “黑狗冷链”),
            HLWL(“HLWL”, “恒路物流”),
            HOAU(“HOAU”, “天地华宇”),
            HOTSCM(“HOTSCM”, “鸿桥供应链”),
            HPTEX(“HPTEX”, “海派通物流公司”),
            hq568(“hq568”, “华强物流”),
            HQSY(“HQSY”, “环球速运 “),
            HXLWL(“HXLWL”, “华夏龙物流”),
            HXWL(“HXWL”, “豪翔物流 “),
            HFHW(“HFHW”, “合肥汇文”),
            HHWL(“HHWL”, “华翰物流”),
            HLONGWL(“HLONGWL”, “辉隆物流”),
            HQKD(“HQKD”, “华企快递”),
            HRWL(“HRWL”, “韩润物流”),
            HTKD(“HTKD”, “青岛恒通快递”),
            HYH(“HYH”, “货运皇物流”),
            HYLSD(“HYLSD”, “好来运快递”),
            JAD(“JAD”, “捷安达 “),
            JGSD(“JGSD”, “京广速递”),
            JIUYE(“JIUYE”, “九曳供应链”),
            JJKY(“JJKY”, “佳吉快运”),
            JLDT(“JLDT”, “嘉里物流”),
            JTKD(“JTKD”, “捷特快递”),
            JXD(“JXD”, “急先达”),
            JYKD(“JYKD”, “晋越快递”),
            JYM(“JYM”, “加运美”),
            JGWL(“JGWL”, “景光物流”),
            JYWL(“JYWL”, “佳怡物流”),
            KYSY(“KYSY”, “跨越速运”),
            KYWL(“KYWL”, “跨越物流”),
            KSDWL(“KSDWL”, “快速递物流”),
            LB(“LB”, “龙邦快递”),
            LJSKD(“LJSKD”, “立即送”),
            LHT(“LHT”, “联昊通速递”),
            MB(“MB”, “民邦快递”),
            MHKD(“MHKD”, “民航快递”),
            MK(“MK”, “美快 “),
            MDM(“MDM”, “门对门快递”),
            MRDY(“MRDY”, “迈隆递运”),
            MLWL(“MLWL”, “明亮物流”),
            NF(“NF”, “南方”),
            NEDA(“NEDA”, “能达速递”),
            PADTF(“PADTF”, “平安达腾飞快递”),
            PANEX(“PANEX”, “泛捷快递”),
            PJ(“PJ”, “品骏”),
            PCA(“PCA”, “PCA Express”),
            QCKD(“QCKD”, “全晨快递”),
            QRT(“QRT”, “全日通快递”),
            QUICK(“QUICK”, “快客快递”),
            QXT(“QXT”, “全信通”),
            RFD(“RFD”, “如风达”),
            RRS(“RRS”, “日日顺物流”),
            RFEX(“RFEX”, “瑞丰速递”),
            SAD(“SAD”, “赛澳递”),
            SAWL(“SAWL”, “圣安物流”),
            SBWL(“SBWL”, “盛邦物流”),
            SDWL(“SDWL”, “上大物流”),
            SFWL(“SFWL”, “盛丰物流”),
            SHWL(“SHWL”, “盛辉物流”),
            ST(“ST”, “速通物流”),
            STWL(“STWL”, “速腾快递”),
            SUBIDA(“SUBIDA”, “速必达物流”),
            SDEZ(“SDEZ”, “速递e站”),
            SCZPDS(“SCZPDS”, “速呈宅配”),
            SURE(“SURE”, “速尔快递”),
            TAIWANYZ(“TAIWANYZ”, “台湾邮政”),
            TSSTO(“TSSTO”, “唐山申通”),
            UAPEX(“UAPEX”, “全一快递”),
            ULUCKEX(“ULUCKEX”, “优联吉运”),
            UEQ(“UEQ”, “UEQ Express”),
            WJK(“WJK”, “万家康 “),
            WJWL(“WJWL”, “万家物流”),
            WXWL(“WXWL”, “万象物流”),
            WHTZX(“WHTZX”, “武汉同舟行”),
            WPE(“WPE”, “维普恩”),
            WTP(“WTP”, “微特派”),
            XBWL(“XBWL”, “新邦物流”),
            XCWL(“XCWL”, “迅驰物流 “),
            XFEX(“XFEX”, “信丰物流”),
            XYT(“XYT”, “希优特”),
            XJ(“XJ”, “新杰物流”),
            YADEX(“YADEX”, “源安达快递”),
            YCWL(“YCWL”, “远成物流”),
            YCSY(“YCSY”, “远成快运”),
            YDH(“YDH”, “义达国际物流”),
            YDT(“YDT”, “易达通 “),
            YFEX(“YFEX”, “越丰物流”),
            YFHEX(“YFHEX”, “原飞航物流”),
            YFSD(“YFSD”, “亚风快递”),
            YTKD(“YTKD”, “运通快递”),
            YXKD(“YXKD”, “亿翔快递”),
            YUNDX(“YUNDX”, “运东西”),
            YMDD(“YMDD”, “壹米滴答”),
            YZBK(“YZBK”, “邮政国内标快”),
            YZTSY(“YZTSY”, “一站通速运”),
            YFSUYUN(“YFSUYUN”, “驭丰速运”),
            ZENY(“ZENY”, “增益快递”),
            ZHQKD(“ZHQKD”, “汇强快递”),
            ZTE(“ZTE”, “众通快递”),
            ZTKY(“ZTKY”, “中铁快运”),
            ZTWL(“ZTWL”, “中铁物流”),
            ZYWL(“ZYWL”, “中邮物流”),
            SJ(“SJ”, “郑州速捷”),
            ZTOKY(“ZTOKY”, “中通快运”);
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_IFOS_PLACE_ORDER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIfosPlaceOrder>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大件跨境国家邮编查询
        /// 大件跨境国家邮编查询目的地可达性:
        /// ● 参数为邮编+国家(英文)
        /// ● 返回地址信息
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IfosPostCodeFetchAddress(string partnerID, string checkword, MsgDataRequestIfosPostCodeFetchAddress data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	FOP_RECE_IFOS_POST_CODE_FETCH_ADDRESS
            批量交易	不支持
            接口类型	接入
            报文类型	表单
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（FOP_RECE_IFOS_POST_CODE_FETCH_ADDRESS）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            属性名	必填	类型	描述
            cityZipCode	是	string	邮编
            countryCode	是	string	国家缩写(英文),可见下单接口里国家英文代码
            成功返回示例的参数说明
            参数名	类型	说明
            business	object	无
            date	string	无
            errorCode	string	无
            errorMessage	string	无
            obj	array	返回的对象
            obj.cityZipCode	string	邮编
            obj.countryCode	string	国家
            obj.disable	boolean	禁用状态 [true:禁用,false:启用]
            obj.distEnName	string	二级区域名称
            obj.isIsolated	boolean	是否偏远地区
            obj.provinceName	string	一级区域名称
            params	array	无
            requestId	string	无
            success	string	成功失败的标志
            version	string	无
            请求报文 （msgData字段）:

            {"cityZipCode":"01007","countryCode":"US"}
            2.4. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
             {
                "business": null,
                "date": 1707125958260,
                "errorCode": null,
                "errorMessage": null,
                "obj": [
                    {
                        "cityZipCode": "01007",
                        "countryCode": "US",
                        "disable": false,
                        "distEnName": "Belchertown",
                        "isIsolated": true,
                        "provinceName": "Massachusetts"
                    }
                ],
                "success": true
            }
            3.1. 错误代码
            3.1 （API）平台结果代码列表
            标识	说明
            A1000	统一接入平台校验成功，调用后端服务成功； 注意：不代表后端业务处理成功，实际业务处理结果， 需要查看响应属性apiResultData中的详细结果
            A1001	必传参数不可为空
            A1002	请求时效已过期
            A1003	IP无效
            A1004	无对应服务权限
            A1005	流量受控
            A1006	数字签名无效
            A1007	重复请求
            A1008	数据解密失败
            A1009	目标服务异常或不可达
            A1099	系统异常
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_IFOS_POST_CODE_FETCH_ADDRESS";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIfosPostCodeFetchAddress>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 回传尺寸信息
        /// 该接口用于顺丰合作伙伴回传给顺丰快运揽收到的货物尺寸信息。当货物到达顺丰合作伙伴仓库时，顺丰合作伙伴揽收后，需要调用此接口。
        /// 调用此接口视同顺丰合作伙伴已揽收到货物。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult I18nDimension(string partnerID, string checkword, MsgDataRequestI18nDimension data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            请求参数

            属性名	参数类型	Required/Optional	描述
            partnerID	String(64)	R	合作伙伴编码（由顺丰分配）
            requestID	String(40)	R	请求唯一号UUID
            serviceCode	String(50)	R	接口服务代码
            timestamp	long	R	调用接口时间戳
            msgDigest	String(128)	R	数字签名
            msgData		R	业务数据报文，参见DimensionRequest
            nonce	int	O	调用接口随机数
            fromCode	Stirng(50)	O	调用平台编码
            versionCode	Stirng(20)	O	业务接口的版本号(请参考具体接口说明)
            DimensionRequest 属性字段

            属性名	参数类型	Required/Optional	描述
            orderNo	String(15)	R	关联的订单号
            receiverCompany	String(100)	R	实际计费重量
            cargos	Array	R	包裹明细， 参见Cargo
            opTime	Date	O	操作时间，揽收时间
            operator	String(20)	O	操作员，唯一标识此员工，用于事后核对揽收信息。由顺丰合作伙伴保证唯一即可。
            opWh	String(20)	O	操作仓库标识，唯一标识仓库，用于事后核对揽收信息。由顺丰合作伙伴保证唯一即可。
            Cargo 属性字段

            属性名	参数类型	Required/Optional	描述
            length	Number(16,2)	R	包裹长
            width	Number(16,2)	R	包裹宽
            height	Number(16,2)	R	包裹高
            weight	Number(16,2)	R	包裹重量
            boxNo	String(30)	O	包裹号，一般为FBA箱号
            extraMap	Array<String, String>	O	扩展字段，包含key和value属性
            请求数据示例：

            POST https://fapi.sf-express.com/fopApiServices/access/enter HTTP/1.1
            Content-Type: application/x-www-form-urlencoded;charset=UTF-8

            partnerID=partnerID&requestID=requestID&serviceCode=FOP_RECE_I18N_DIMENSION&timestamp=112500000&msgDigest=msgDigest&nonce=4678965&fromCode=fromCode&versionCode=v1.0.1&msgData={"orderNo":"orderNo","receiverCompany":"receiverCompany","cargos":[{"length":1,"width":1,"height":1,"weight":1,"boxNo":"boxNo","extraMap":[{"key":"key","value":"value"}]}],"opTime":"2021-01-02 14:20:30","operator":"operator","opWh":"opWh"}
            响应参数

            属性名	参数类型	Required/Optional	描述
            apiResultCode	String(10)	R	API平台结果代码
            apiErrorMsg	String(200)	O	API平台异常信息
            apiResponseID	String(40)	R	API响应唯一号UUID
            apiResultData	String	O	业务处理详细结果
            响应数据示例：

            Content-Type: application/json; charset=utf-8

            {
              "apiResultCode": "A1000",
              "apiResponseID": "apiResponseID"
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_I18N_DIMENSION";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                errmsg = result.apiErrorMsg;
                resultdata = result.apiResultData;
                if (result.apiResultCode == "A1000")
                {
                    errcode = "0";
                }
                else
                {
                    errcode = result.apiResultCode;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 获取包裹详情 FOP_PUSH_I18N_PACKAGE
        /// 该接口用于顺丰快运查询顺丰合作伙伴的包裹运输详情。当货物被顺丰合作伙伴揽收后，需要调用此接口。
        /// 当顺丰合作伙伴不具备 3.4 回传包裹详情 的能力时，由顺丰快运调用此接口来替代。
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static SFResponseApiResultData PushI18nPackage(string body, out MsgDataRequestPushI18nPackage msgData)
        {
            /*
            请求参数

            属性名	参数类型	Required/Optional	描述
            logisticID	String(20)	R	物流公司代码，SF代表顺丰
            requestID	String(40)	R	请求唯一号UUID
            serviceCode	String(50)	R	接口服务代码
            timestamp	long	R	调用接口时间戳
            msgDigest	String(128)	R	数字签名
            msgData		R	业务数据报文，参见PackageRequest
            nonce	int	O	调用接口随机数
            PackageRequest 属性字段

            属性名	参数类型	Required/Optional	描述
            referenceNo	String(20)	R	查询唯一标识
            请求数据示例：

            POST https://<cp服务域名>/<服务path> HTTP/1.1
            Content-Type: application/x-www-form-urlencoded;charset=UTF-8

            logisticID=SF&requestID=requestID&serviceCode=FOP_PUSH_I18N_PACKAGE&timestamp=112500000&msgDigest=msgDigest&nonce=4678965&msgData={"referenceNo":"referenceNo"}
            响应参数

            属性名	参数类型	Required/Optional	描述
            apiResultCode	String(10)	R	API平台结果代码
            apiErrorMsg	String(200)	O	API平台异常信息
            apiResponseID	String(40)	R	API响应唯一号UUID
            apiResultData	String	O	业务处理详细结果，参见PackageResponse
            PackageResponse 属性字段

            属性名	参数类型	Required/Optional	描述
            orderNo	String(15)	R	关联的订单号
            routes	Array	R	路由信息，顺序全部以降序存放，参见Route
            Route 属性字段

            属性名	参数类型	Required/Optional	描述
            opTime	Date	R	操作时间
            opCode	String(20)	R	操作类型
            opAddr		O	操作当时的地址，参见Addr
            Addr属性字段

            属性名	参数类型	Required/Optional	描述
            country	String(10)	O	国家
            province	String(30)	O	省份
            city	String(30)	O	城市
            county	String(30)	O	区
            address	String(200)	R	详细地址
            postCode	String(20)	O	邮编
            响应数据示例：

            Content-Type: application/json; charset=utf-8

            {
              "apiResultCode": "A1000",
              "apiResponseID": "apiResponseID",
              "apiResultData": {
                "orderNo": "",
                "routes": [
                  {
                    "opTime": "2021-04-13 13:30",
                    "opCode": "Delivered",
                    "opAddr": {
                      "country": "US",
                      "province": "province",
                      "city": "city",
                      "county": "county",
                      "address": "address",
                      "postCode": "postCode"
                    }
                  }
                ]
              }
            }
            */

            string apiResultCode = "";
            string apiErrorMsg = "";
            string apiResponseID = Guid.NewGuid().ToString(); //获取uuid
            string apiResultData = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<PushI18nPackageRequest>(body);
                if (reqData != null)
                {
                    msgData = reqData.msgData;
                    apiResultCode = "A1000";
                    ResponsePushI18nPackage packageResponse = new ResponsePushI18nPackage();
                    packageResponse.orderNo = ""; //这个订单号是什么数据？
                    packageResponse.routes = new List<RouteModel>();//这个路由信息，顺序全部以降序存放，参见Route 怎么获取到？
                    apiResultData = JsonHelper.SerializeObject(packageResponse);
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new SFResponseApiResultData()
            {
                apiResultCode = apiResultCode,
                apiErrorMsg = apiErrorMsg,
                apiResponseID = apiResponseID,
                apiResultData = apiResultData
            };
        }

        /// <summary>
        /// 回传包裹详情
        /// 该接口用于顺丰合作伙伴回传给顺丰快运揽收到的包裹运输详情。当包裹在顺丰合作伙伴运输时有变化时，需要顺丰合作伙伴主动调用此接口。
        /// 此接口提供后，就不用提供 3.3 获取包裹详情 接口了。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult ReceI18nPackage(string partnerID, string checkword, MsgDataRequestReceI18nPackage data, string environment = "bspgw")
        {
            /*	
            请求参数

            属性名	参数类型	Required/Optional	描述
            partnerID	String(64)	R	合作伙伴编码（由顺丰分配）
            requestID	String(40)	R	请求唯一号UUID
            serviceCode	String(50)	R	接口服务代码
            timestamp	long	R	调用接口时间戳
            msgDigest	String(128)	R	数字签名
            msgData		R	业务数据报文，参见PackageRequest
            nonce	int	O	调用接口随机数
            fromCode	Stirng(50)	O	调用平台编码
            versionCode	Stirng(20)	O	业务接口的版本号(请参考具体接口说明)
            PackageRequest 属性字段

            属性名	参数类型	Required/Optional	描述
            orderNo	String(15)	R	关联的订单号
            routes	Array	R	路由信息，顺序全部以降序存放，参见Route
            Route属性字段

            属性名	参数类型	Required/Optional	描述
            opTime	Date	R	操作时间
            opCode	String(20)	R	操作类型
            opAddr		O	操作当时的地址，参见Addr
            Addr属性字段

            属性名	参数类型	Required/Optional	描述
            country	String(10)	O	国家
            province	String(30)	O	省份
            city	String(30)	O	城市
            county	String(30)	O	区
            address	String(200)	R	详细地址
            postCode	String(20)	O	邮编
            请求数据示例：

            POST https://fapi.sf-express.com/fopApiServices/access/enter HTTP/1.1
            Content-Type: application/x-www-form-urlencoded;charset=UTF-8

            partnerID=partnerID&requestID=requestID&serviceCode=FOP_RECE_I18N_PACKAGE&timestamp=112500000&msgDigest=msgDigest&nonce=4678965&fromCode=fromCode&versionCode=v1.0.1&msgData={"orderNo":"","routes":[{"opTime":"2021-04-13 13:30","opCode":"Delivered","opAddr":{"country":"US","province":"province","city":"city","county":"county","address":"address","postCode":"postCode"}}]}
            响应参数

            属性名	参数类型	Required/Optional	描述
            apiResultCode	String(10)	R	API平台结果代码
            apiErrorMsg	String(200)	O	API平台异常信息
            apiResponseID	String(40)	R	API响应唯一号UUID
            apiResultData	String	O	业务处理详细结果
            响应数据示例：

            Content-Type: application/json; charset=utf-8

            {
              "apiResultCode": "A1000",
              "apiResponseID": "apiResponseID"
            }
            4. 附录
            4.1 产品代码
            标识	中文名
            A100	FBA跨境特快
            A101	FBA跨境普快
            A102	FBA跨境经济
            S100	跨境海派
            S101	跨境海卡（不预付关税）
            S102	跨境海卡（关税预付）
            S103	跨境整柜
            L100	跨境卡航
            L101	跨境中欧班列
            4.2 国家/地区代码
            标识	中文名
            DE	德国
            FR	法国
            CA	加拿大
            US	美国
            JP	日本
            ES	西班牙
            IT	意大利
            GB	英国
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_I18N_PACKAGE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid
            string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            content["msgDigest"] = msgDigest;
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                errmsg = result.apiErrorMsg;
                resultdata = result.apiResultData;
                if (result.apiResultCode == "A1000")
                {
                    errcode = "0";
                }
                else
                {
                    errcode = result.apiResultCode;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大件跨境下载顺丰面单-获取批次号
        /// 大件跨境下载顺丰面单:
        /// ● 客户系统向顺丰大件跨境下载顺丰面单。
        /// ● 返回打印批次号。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IfosOrderPrintInfo(string partnerID, string checkword, MsgDataRequestIfosOrderPrintInfo data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2.1. 公共参数
            名称	值
            接口服务代码	FOP_RECE_IFOS_ORDER_PRINT_INFO
            批量交易	不支持
            接口类型	接入
            报文类型	表单
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（FOP_RECE_IFOS_ORDER_PRINT_INFO）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            属性名	必填	类型	描述
            waybillNo	是	string	运单号
            sysCode	是	string	系统编码，固定填写FOP-IFOS-CORE
            成功返回示例的参数说明
            参数名	类型	说明
            business	object	无
            date	string	无
            errorCode	string	无
            errorMessage	string	无
            obj	object	无
            obj.errorMsg	string	无
            obj.fileType	string	无
            obj.files	string	无
            obj.printBatchNo	string	批次号
            obj.sysCode	string	无
            success	string	无
            请求报文 （msgData字段）:

            {
                "waybillNo":"SF1342849028987",
                "sysCode":"FOP-IFOS-CORE"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
             {
                "business": null,
                "date": 1715596683611,
                "errorCode": null,
                "errorMessage": null,
                "obj": {
                    "errorMsg": null,
                    "fileType": null,
                    "files": [],
                    "printBatchNo": "AAABj3GH6W8GvmS3z8lBZJtV1qajG9h9",
                    "sysCode": null
                },
                "success": true
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_IFOS_ORDER_PRINT_INFO";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIfosOrderPrintInfo>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 大件跨境下载顺丰面单-根据批次号获取文件
        /// 大件跨境下载顺丰面单:
        /// ● 客户系统根据批次号向顺丰大件跨境下载顺丰面单。
        /// ● 返回面单下载地址。
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult IfosOrderPrintQueryResult(string partnerID, string checkword, MsgDataRequestIfosOrderPrintQueryResult data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            2. 接口定义
            2.1. 公共参数
            名称	值
            接口服务代码	FOP_RECE_IFOS_ORDER_PRINT_QUERY_RESULT
            批量交易	不支持
            接口类型	接入
            报文类型	表单
            2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	partnerID	String(64)	是	合作伙伴编码（即顾客编码）
            2	requestID	String(40)	是	请求唯一号UUID
            3	serviceCode	String(50)	是	接口服务代码（FOP_RECE_IFOS_ORDER_PRINT_QUERY_RESULT）
            4	timestamp	long	是	调用接口时间戳
            5	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填
            签名方法参考：数字签名认证说明
            6	accessToken	String	条件	accessToken,使用OAuth2方式认证时必填
            获取方法参考：OAuth2认证说明
            7	msgData	String	是	业务数据报文
            2.3. 请求参数<msgData>
            2.3.1 元素<请求>
            属性名	必填	类型	描述
            printBatchNo	是	string	批次号
            sysCode	是	string	系统编码，固定FOP-IFOS-CORE
            成功返回示例的参数说明
            参数名	类型	说明
            business	object	无
            date	string	无
            errorCode	string	无
            errorMessage	string	无
            obj	object	无
            obj.errorReason	string	无
            obj.files	string	无
            obj.files.seqNo	string	无
            obj.files.token	string	无
            obj.files.url	string	面单下载地址
            obj.files.waybillNo	string	无
            obj.status	string	无
            obj.sysCode	string	无
            success	string	无
            请求报文 （msgData字段）:

            {
                "printBatchNo":"AAABj3GH6W8GvmS3z8lBZJtV1qajG9h9",
                "sysCode":"FOP-IFOS-CORE"
            }
            2.7. 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "business": null,
                "date": 1715597574090,
                "errorCode": null,
                "errorMessage": null,
                "obj": {
                    "errorReason": null,
                    "files": [
                        {
                            "seqNo": 0,
                            "token": "AUTH_tkv12_f146d1855480549d262b5c46ab0ab597207bd99206fbe23b524336bf014ef5140feb297041dd0a61c3b1c69e462cc061d55f0de15d461b5061b66be3d7ea3c3ea560c81f4c9fb14e86dfc28fcfb75fd9d87b567491d6fa079ac79d44b6ba8276187e8f60e1f38b5bd57338f911ad5d3a70bccc222ddcacdc4042b9f70fec18c2f6692658be8a5817adcd46dd913a67c4f2794661b0db078be946b3abb127f9d78fdf1ca17645242b4d7dc842bd121efb06209d12c7a51b6c9c9794926ee649a0",
                            "url": "https://eos-scp-core-shenzhen-xili1-oss.sit.sf-express.com:443/v1.2/AUTH_EOS-SCP-CORE/print-file/FOP-IFOS-CORE_1715596683515_AAABj3GH8FDqP958X0pCIoLKuIc_rWAp_fop-ifos-core_fba_12_12.pdf",
                            "waybillNo": null
                        }
                    ],
                    "status": "1",
                    "sysCode": null
                },
                "success": true
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_IFOS_ORDER_PRINT_QUERY_RESULT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseIfosOrderPrintQueryResult>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        #endregion 跨境大件类

        #region 安装服务-供应商接入

        /// <summary>
        /// 安装任务推送接口 FOP_PUSH_FIS_ORDER
        /// 此接口按照顺丰开放平台标准对接，对接方式请查看【https://open.sf-express.com/developSupport/976720?activeIndex=802125】
        /// 此接口为安装任务初始化、更新及取消时，推送给供应商。供应商接收订单时，需要根据taskCode做唯一性判断。
        /// Service Code： FOP_PUSH_FIS_ORDER
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisOrder PushFisOrder(string body, out RequestPushFisOrder msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            orderList	订单列表	true	list	订单信息包装在list中，目前list一定只有一个订单，直接取第一个。下面的字段是order对象内部字段
            waybillNo	母单号	true	string	
            taskCode	任务编码	true	string	
            subWaybillNos	子单号	false	string	用逗号（,）隔开，此字段可以用于提货+安装业务的提货包裹数的校验。
            orderSource	订单来源，如京东	false	string	
            customOrderId	客户订单号	false	string	
            cargoName	货物名称	false	string	
            totalVolume	货物体积	false	string	
            totalWeight	货物重量	false	string	
            receiverName	收件人	true	string	
            serviceType	安装类型	true	Integer	1:上门安装 2：提货+安装 7:维修 8:检测维修
            receiverPhone	收件人电话	true	string	
            receiverAddress	收件人地址	true	string	
            packageCount	子母件数	true	int	
            version	版本号	true	int	
            supplierOrderStatus	订单状态	true	string	1：新增/修改 2：取消，可以使用version判断数据版本号
            remark	备注	false	string	
            cancelReason	取消原因	false	string	当取消时会有值
            cancelTime	取消时间	false	string	当取消时有值，示例：2024-03-19 12:45:12
            installTypes	安装品类	true	List	参见 InstallTypeDto
            extendInfo	扩展字段	false	Map<String, String>	Key & Value数据对
            orderTag	顺丰、顺心标示	false	string	用于顺丰、顺心捷达两品牌都支持的供应商进行品牌区分
            expectServiceTime	期望服务时间	false	string	2021.12.21日新增字段 示例：2021-12-21 15:00
            logisticsCompany	物流公司名称	false	string	2021.12.21日新增字段 示例：顺丰快运
            logisticsNo	物流运单号	false	string	2021.12.21日新增字段 示例：SF10000010101
            addedServices	增值服务	false	List<AddedServiceDto>	参见 AddedServiceDto
            InstallTypeDto
            参数名称	参数说明	是否必有	数据类型	说明
            installTypeCode	安装品类编码	true	String	
            installTypeName	安装品类名	true	String	
            imageUrl	安装品类图片，逗号隔开	false	String	2021.12.07新增字段 此链接永久有效
            videoUrl	安装视频，逗号隔开	false	String	2021.12.07新增字段 此链接一天有效期，请自行保存
            installRemark	安装品类备注	false	String	
            count	数量	true	int	
            businessName	行业名称	true	String	如：空调
            faultCause	故障原因	false	List<String>	
            AddedServiceDto（详情见附录1.1）
            参数名称	参数说明	是否必有	数据类型	说明
            addedServiceName	增值服务名	true	String	
            addedServiceCode	增值服务代码	true	String	
            addedServicePrice	增值服务价格	false	double(20,2)	
            返回参数
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到任务推送信息，否则系统自动重试10次。

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            标准报文参考-单个品类：

            {
                "orderList": [
                    {
                        "businessCode": "HY0001",
                        "businessName": "家具",
                        "cargoName": "1个格子",
                        "expectServiceTime": "",
                        "installTypes": [
                            {
                                "count": 1,
                                "imageUrl": "https://chan-fop-chan-site-shenzhen-xili1-oss.sit.sf-express.com/v1.2/AUTH_chan-FOP-CHAN-SITE/sfosspublic001/fmasterPub202111181816013859bIMG20201105_104924.png,https://chan-fop-chan-site-shenzhen-xili1-oss.sit.sf-express.com/v1.2/AUTH_chan-FOP-CHAN-SITE/sfosspublic001/fmasterPub202111181816013859bIMG20201105_104924.png",
                                "installTypeCode": "8891886",
                                "installTypeName": "1个格子",
                                "installRemark":"这是当前安装品类的备注哟",
                                "videoUrl": "http://chan-fop-fis-core-shenzhen-xili1-oss.sit.sf-express.com:8080/v1/AUTH_chan-FOP-FIS-CORE/fis/fmasterPri2021111818160528759a5e0777176fe8f6414da30a180d2bca4.mp4?temp_url_sig=558b883102cbd8e4b18ea0ce7838d8c4bbe1d290&temp_url_expires=1638852915,http://chan-fop-fis-core-shenzhen-xili1-oss.sit.sf-express.com:8080/v1/AUTH_chan-FOP-FIS-CORE/fis/fmasterPri2021111818160528759a5e0777176fe8f6414da30a180d2bca4.mp4?temp_url_sig=558b883102cbd8e4b18ea0ce7838d8c4bbe1d290&temp_url_expires=1638852915"
                            }
                        ],
                        "isRateReward": false,
                        "orderSource": "FMASTER",
                        "orderTag": "SF",
                        "packageCount": 1,
                        "rateRewardValue": 15,
                        "receiverAddress": "天津市天津市和平区1",
                        "receiverName": "444",
                        "receiverPhone": "17670459501",
                        "remark": "",
                        "serviceType": 1,
                        "supplierOrderStatus": "2",
                        "taskCode": "502540",
                        "totalVolume": "",
                        "totalWeight": "",
                        "updateOrder": false,
                        "version": 2,
                        "waybillNo": "SJA100100232491"
                    }
                ]
            }
            标准报文参考-多个品类：

            {
                "orderList": [
                    {
                        "businessCode": "HY0001",
                        "businessName": "家具",
                        "cargoName": "1个格子",
                        "expectServiceTime": "",
                        "installTypes": [
                            {
                                "count": 1,
                                "imageUrl": "https://chan-fop-chan-site-shenzhen-xili1-oss.sit.sf-express.com/v1.2/AUTH_chan-FOP-CHAN-SITE/sfosspublic001/fmasterPub202111181816013859bIMG20201105_104924.png,https://chan-fop-chan-site-shenzhen-xili1-oss.sit.sf-express.com/v1.2/AUTH_chan-FOP-CHAN-SITE/sfosspublic001/fmasterPub202111181816013859bIMG20201105_104924.png",
                                "installTypeCode": "8891886",
                                "installTypeName": "1个格子",
                                "installRemark":"这是当前安装品类的备注哟",
                                "videoUrl": "http://chan-fop-fis-core-shenzhen-xili1-oss.sit.sf-express.com:8080/v1/AUTH_chan-FOP-FIS-CORE/fis/fmasterPri2021111818160528759a5e0777176fe8f6414da30a180d2bca4.mp4?temp_url_sig=558b883102cbd8e4b18ea0ce7838d8c4bbe1d290&temp_url_expires=1638852915,http://chan-fop-fis-core-shenzhen-xili1-oss.sit.sf-express.com:8080/v1/AUTH_chan-FOP-FIS-CORE/fis/fmasterPri2021111818160528759a5e0777176fe8f6414da30a180d2bca4.mp4?temp_url_sig=558b883102cbd8e4b18ea0ce7838d8c4bbe1d290&temp_url_expires=1638852915"
                            },
		            {
                                "count": 1,
                                "imageUrl": "https://chan-fop-chan-site-shenzhen-xili1-oss.sit.sf-express.com/v1.2/AUTH_chan-FOP-CHAN-SITE/sfosspublic001/fmasterPub202111181816013859bIMG20201105_104924.png,https://chan-fop-chan-site-shenzhen-xili1-oss.sit.sf-express.com/v1.2/AUTH_chan-FOP-CHAN-SITE/sfosspublic001/fmasterPub202111181816013859bIMG20201105_104925.png",
                                "installTypeCode": "8891887",
                                "installTypeName": "2个格子",
                                "installRemark":"这是当前安装品类的备注哟2",
                                "videoUrl": "http://chan-fop-fis-core-shenzhen-xili1-oss.sit.sf-express.com:8080/v1/AUTH_chan-FOP-FIS-CORE/fis/fmasterPri2021111818160528759a5e0777176fe8f6414da30a180d2bca4.mp4?temp_url_sig=558b883102cbd8e4b18ea0ce7838d8c4bbe1d290&temp_url_expires=1638852915,http://chan-fop-fis-core-shenzhen-xili1-oss.sit.sf-express.com:8080/v1/AUTH_chan-FOP-FIS-CORE/fis/fmasterPri2021111818160528759a5e0777176fe8f6414da30a180d2bca4.mp4?temp_url_sig=558b883102cbd8e4b18ea0ce7838d8c4bbe1d290&temp_url_expires=1638852916"
                            }
                        ],
                        "isRateReward": false,
                        "orderSource": "FMASTER",
                        "orderTag": "SF",
                        "packageCount": 1,
                        "rateRewardValue": 15,
                        "receiverAddress": "天津市天津市和平区1",
                        "receiverName": "444",
                        "receiverPhone": "17670459501",
                        "remark": "",
                        "serviceType": 1,
                        "supplierOrderStatus": "2",
                        "taskCode": "502540",
                        "totalVolume": "",
                        "totalWeight": "",
                        "updateOrder": false,
                        "version": 2,
                        "waybillNo": "SJA100100232491"
                    }
                ]
            }
            标准返回报文参考：
            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            附录1.1
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到任务推送信息，否则系统自动重试10次。

            增值服务代码	增值服务名称
            JZ17	好评返现
            JZ22	当日达
            */

            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisOrder>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisOrder()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 推送到货信息 FOP_PUSH_FIS_DELIVERY_NOTICE
        /// 此接口按照顺丰开放平台标准对接，对接方式请查看【https://open.sf-express.com/developSupport/976720?activeIndex=802125】
        /// 此接口为推送到货通知接口。对于不同的业务，有可能在不同的节点推送到货：
        /// 货物到指定位置，可以前往提货并安装，此操作对应提货+安装业务。
        /// 货物已送到客户家，可以前往安装。
        /// Service Code： FOP_PUSH_FIS_DELIVERY_NOTICE
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisDeliveryNotice PushFisDeliveryNotice(string body, out RequestPushFisDeliveryNotice msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            waybillNo	母单号	true	string	
            taskCode	任务编码	true	string	
            time	到货时间	true	string	格式为：yyyy-MM-hh HH:mm:ss
            serviceType	服务类型	true	int	1:上门安装 2：提货+安装
            pickupZone	提货网点	false	string	提货的网点，如上梅林集配站
            pickupContact	提货联系人	false	string	
            pickupPhone	提货联系电话	false	String	电话有可能是手机或固定电话，不能保证格式统一
            pickupAddress	提货地址	false	String	
            receiveContact	收件人	true	string	
            receivePhone	收件联系人电话	true	string	
            receiveProvince	收件人地址的省	true	string	
            receiveCity	收件人地址的市	true	string	
            receiveCounty	收件人地址的区	false	string	
            receiveAddress	收件人详细地址	true	string	
            parcelQuantity	包裹数量	true	int	
            返回参数
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到任务推送信息，否则系统自动重试10次。

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            标准报文参考：

            {
             "orderTag": "SF",
             "receiveAddress": "广东省深圳市南山区粤海街道彩讯科创中心",
             "receiveCity": "深圳市",
             "receiveContact": "张三",
             "receiveCounty": "南山区",
             "receivePhone": "13590158092",
             "receiveProvince": "广东省",
             "serviceType": 1,
             "taskCode": "393470",
             "time": "2021-08-31 11:31:50",
             "waybillNo": "SJA100100177096"
            }
            标准返回报文参考：
            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */

            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisDeliveryNotice>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisDeliveryNotice()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 图片回传接口
        /// 该接口不走顺丰统一接入平台，clientCode就是partnerID。
        /// 说明：必须上传完工图，其他操作可视情况决定是否上传图片。
        /// 签名（digest）：Base64(MD5 (clientCode + imageNumber + imageType + waybillNo +taskCode+ md5key) )
        /// md5key：联系开发人员获取固定md5Key
        /// Content-Type: multipart/form-data
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="md5key">联系开发人员获取固定md5Key</param>
        /// <param name="imageType">图片类型 true	integer	68:完工图（必须）9:提货照片，13:安装异常照片 17:装前检查图片（必须） 20:好评返现图片 2：其他</param>
        /// <param name="waybillNo">运单号	true	string	</param>
        /// <param name="taskCode">任务编码	true	string</param>
        /// <param name="fileDictionary">图片列表</param>
        /// <param name="isFormalEnvironment">是否正式环境，默认为true 正式环境，否则测试环境</param>
        /// <returns></returns>
        public static JsonResult FisImageUpload(string partnerID, string md5key, int imageType, string waybillNo, string taskCode, Dictionary<string, string> fileDictionary, string videoUrl = "", bool isFormalEnvironment = true)
        {
            /*	
            接口说明：
            该接口不走顺丰统一接入平台，clientCode就是partnerID。
            说明：必须上传完工图，其他操作可视情况决定是否上传图片。

            签名（digest）：Base64(MD5 (clientCode + imageNumber + imageType + waybillNo +taskCode+ md5key) )

            md5key：联系开发人员获取固定md5Key

            Content-Type: multipart/form-data

            请求地址：
            测试环境：
            http://fapi.sit.sf-express.com/hinplusService/routerPic/imageUpload

            生产环境：
            https://fapi.sf-express.com/hinplusService/routerPic/imageUpload

            Service Code： FOP_RECE_FIS_IMAGE_UPLOAD

            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            imageType	图片类型	true	integer	68:完工图（必须）9:提货照片，13:安装异常照片 17:装前检查图片（必须） 20:好评返现图片 2：其他
            taskCode	任务编码	true	string	
            waybillNo	运单号	true	string	
            images	images	true	MultipartFile	此参数选择文件类型，支持多张图片上传
            clientCode	客户编码，同partnerID	true	string	客户编码为身份验证，不能为空
            digest	Base64(MD5 (clientCode + imageNumber + imageType + waybillNo +taskCode + md5key) )	true	string	imageNumber：图片数量
            videoUrl	视频url	false	string	供应商完工时，回传的视频url
            请求示例

            //供应商图片回传接口http请求演示
            @Test
            public void picFromSupplier()
            {
                HashMap<String, String> data = new HashMap<>();
                data.put("imageType", "9");
                data.put("waybillNo", "SF10111847795918");
                data.put("taskCode", "70446");
                data.put("clientCode", "FOP_JDD516");
                //图片签名生成方式
                String digest = new StringBuilder().
                        append(fileUploadDto.getClientCode()).
                        append(Integer.valueOf(picNumber)).
                        append(fileUploadDto.getImageType()).
                        append(wayBillNo).
                        append(taskCode).
                        append(md5Key).toString();
                digest = Base64.getEncoder().encodeToString(DigestUtils.md5Digest(digest.getBytes()));
                data.put("digest", "SXaa/IXFpz8L1BXUbNi4Aw==");
                String url = "http://fapi.sit.sf-express.com/hinplusService/routerPic/imageUpload";
                File file = new File("d://IMG20201023_135451.jpg");
                ArrayList<File> files = new ArrayList<>();
                files.add(file);
                log.info(uploadPic(data, url, files));
            }

            //上传图片
            @param data
                * @param url
                * @param files
                * @return
            public static String uploadPic(Map<String, String> data, String url, List<File> files)
            {
                try
                {
                    OkHttpClient.Builder builder = new OkHttpClient.Builder();
                    OkHttpClient okHttpClient = builder.build();
                    MultipartBody.Builder postBody = new MultipartBody.Builder().setType(MultipartBody.FORM);
                    for (String key : data.keySet()) {
                        postBody.addFormDataPart(key, data.get(key));
                    }
                    files.forEach(file->postBody.addFormDataPart("images", file.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), file)));
                    Request request = new Request.Builder().
                            url(url).
                            post(postBody.build()).
                            build();
                    Call call = okHttpClient.newCall(request);
                    Response response = call.execute();
                    if (response.isSuccessful() && null != response.body())
                    {
                        return response.body().string();
                    }
                    return response.message();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
            返回参数

            属性名	参数类型	Required/Optional	描述
            errorCode	String	O	错误代码
            errorMessage	String	O	错误描述
            success	Boolean	R	是否成功
            返回实例

            {"success":false,"errorCode":"400","errorMessage":"运单号有误，不存在此运单","obj":null}
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            int imageNumber = fileDictionary.Count;
            //签名（digest）：Base64(MD5(clientCode + imageNumber + imageType + waybillNo + taskCode + md5key))
            string digest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(partnerID + imageNumber + imageType + waybillNo + taskCode + md5key));

            string postData = "";
            if (!string.IsNullOrWhiteSpace(videoUrl))
            {
                postData = JsonHelper.SerializeObject(new
                {
                    waybillNo = waybillNo,
                    clientCode = partnerID,
                    taskCode = taskCode,
                    imageType = imageType,
                    digest = digest,
                    videoUrl = videoUrl
                });
            }
            else
            {
                postData = JsonHelper.SerializeObject(new
                {
                    waybillNo = waybillNo,
                    clientCode = partnerID,
                    taskCode = taskCode,
                    imageType = imageType,
                    digest = digest
                });
            }

            //var fileDictionary = new Dictionary<string, string>();
            //fileDictionary["file"] = file;

            var result = HttpHelper.GetResponseFis(postData, fileDictionary, isFormalEnvironment);
            if (result != null)
            {
                errmsg = result.errorMessage;
                if (result.success)
                {
                    errcode = "0";
                }
                else
                {
                    errcode = result.errorCode;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 增值服务审核  FOP_PUSH_FIS_AUDIT_COMMENT
        /// 此接口走统一接入平台，请求方式请查看【https://open.sf-express.com/developSupport/976720?activeIndex=802125】
        /// 此接口由供应商提供，1，好评返现：当师傅提交好评返现图片后，客户调用此接口发起审核操作；2，当日达：当师傅按时完工后，客户调用此接口发起审核
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_AUDIT_COMMENT
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisAuditComment PushFisAuditComment(string body, out RequestPushFisAuditComment msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            waybillNo	运单号	true	String	
            auditStatus	审核状态	true	String	AUDIT_PASSED：审核通过 AUDIT_REFUSED：审核拒绝
            auditRemark	审核描述	false	String	审核拒绝时，客户必填
            auditItem	审核项	false	String	详情见附录1.2增值服务代码， 为空默认为好评返现
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null
            }
            */

            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisAuditComment>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisAuditComment()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 推送期望服务时间 FOP_PUSH_FIS_EXPEDITE_INSTALL_NOTICE
        /// 此接口走统一接入平台，请求方式请查看【https://open.sf-express.com/developSupport/976720?activeIndex=802125】
        /// 此接口为推送物流预计到达时间（期望服务时间）接口。对包含当日装增值服务的订单，具有严格的时效要求，会动态变更期望服务时间并将该时间推给合作商。
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_EXPEDITE_INSTALL_NOTICE
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisExpediteInstallNotice PushFisExpediteInstallNotice(string body, out RequestPushFisExpediteInstallNotice msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            waybillNo	订单号	true	string	订单号
            taskCode	任务编码	true	string	任务编码
            opTime	操作时间	true	string	格式为：yyyy-MM-hh HH:mm:ss
            expectInstallTime	物流预计到达时间/期望服务时间	true	string	格式为：yyyy-MM-hh HH:mm
            请求报文参考：


            {
             "waybillNo":"SF1654162132123",
             "taskCode":"846685",
             "opTime" :"2024-03-15 17:14:30",
             "expectInstallTime ":"2024-03-16 15:02"
            }

            返回参数
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到期望服务时间推送信息，否则系统自动重试10次。

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            标准返回报文参考：

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisExpediteInstallNotice>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisExpediteInstallNotice()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 操作节点回传接口
        /// 此接口走统一接入平台，请求方式请查看【https://open.sf-express.com/developSupport/976720?activeIndex=802125】
        /// 此接口为供应商提货、完工、核销、分配师傅、预约、异常反馈等操作信息回传接口。
        /// Service Code： FOP_RECE_FIS_OPEARTION_UPLOAD （2021.6.1失效）
        /// Service Code： FOP_RECE_FIS_ROUTER（2021.6.1之后生效）
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FisRouter(string partnerID, string checkword, MsgDataRequestFisRouter data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            appTime	预约时间	false	string	预约时间（已废弃）
            appStartTime	预约开始时间	false	string	格式”yyyy-MM-dd HH:mm:ss “，预约操作时此字段必填（新增）
            appEndTime	预约结束时间	false	string	格式”yyyy-MM-dd HH:mm:ss “，预约操作时此字段必填（新增）
            city	当前城市	false	string	
            content	操作描述	true	string	所有操作必须有此字段，格式可按下面说明进行编写
            exceptionCode	异常编码	false	integer	（此字段为预留字段，暂未启用）
            installContact	安装师傅联系方式	false	string	分配安装师傅节点必填
            emergContactPhone	安装师傅紧急联系方式	false	string	安装师傅备用联系电话
            installMaster	安装师傅	false	string	分配安装师傅时必填，未分配安装师傅前传操作员
            operateCode	操作码	true	integer	操作码见下面枚举, 提货请传入 9
            operateTime	操作时间	true	string	格式”yyyy-MM-dd HH:mm:ss “
            taskCode	任务编码	true	string	唯一标志
            uniqueId	唯一校验码	false	string	
            verifyCancelCode	核销码	false	string	无需对接，字段未启用
            waybillNo	运单号	true	string	母单号
            images	操作图片url	false	List<String>	operateCode = 21时必传 , 最多10张,需联系顺丰科技人员开墙
            faultCause	故障原因	false	List<String>	operateCode = 21时必传 ，最多3个
            isSendPart	是否需要补发配件	false	int	0否1是 ，operateCode = 21时必传
            isSelfPurchasePart	是否自购配件	false	int	0否1是，operateCode = 21时必传
            partModels	配件型号	false	List<String>	operateCode = 21时，且isSendPart = 1 或 isSelfPurchasePart=1时必传
            partAmount	自购配件金额	false	double	isSelfPurchasePart = 1时必传

            操作码枚举(数字为操作码，操作类型，操作描述示例)

            DISPATCH_INSTALLER(  1, "分配安装师傅"，"安装师傅:姜华,联系方式：180"),
            SJOB_DONE_STATE(  3, "完工","师傅已服务完工")(可不传此节点，仅上传完工图片就ok),
            STAKE_CARGO_STATE(  9, "提货","提货人：姜华，提货时间:...，提货人联系方式：..."),
            SAPPOINTMENT_ED_STATE(  10, "预约成功"，"安装师傅:姜华,联系方式：180,预约时间：2020-12-08 15:00:00"),
            SCANCEL_VERIFICATION_STATE(  11, "核销"，"核销"),
            INSTALL_EXCEPTION(  13, "安装异常"，"取消原因：客户已安装"、"用户取消安装、异常的描述按实际情况反馈"),
            APPOINTMENT_FAILED(  14, "预约失败"，"安装师傅:姜华,联系方式：180,预约失败,预约时间：2020-12-08 15:00:00")，
            OP_VISIT_CLOCK( 16,"上门打卡"),//2021.11.09新增
            GOOD_COMMENT(20,"好评返现"),
            CHECK_FAULTS(21,"检测"),
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_ROUTER";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<ResponseFisRouter>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 推送配件物流信息 FOP_PUSH_FIS_PART_TRANS
        /// 此接口按照顺丰开放平台标准对接，对接方式请查看【https://open.sf-express.com/developSupport/976720?activeIndex=802125】
        /// 此接口为检修单补发配件物流信息通知接口 ， 此接口在配件运单到货状态更改时会再次推送
        /// Service Code： FOP_PUSH_FIS_PART_TRANS
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisPartTrans PushFisPartTrans(string body, out RequestPushFisPartTrans msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            waybillNo	订单号	true	string	
            taskCode	任务编码	true	string	
            logisticsCompany	物流公司名称	true	string	如顺丰速运
            partWaybillNo	配件运单号	true	string	如SF123156105615600
            isArrive	配件是否到货	true	int	0否 1是
            返回参数
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到任务推送信息，否则系统自动重试10次。

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            标准报文参考：

            {
             "logisticsCompany": "顺丰速运",
             "waybillNo": "SJA2015105615",
             "taskCode":"489434",
             "partWaybillNo":"SF132156105615",
             "isArrive": 0
            }
            标准返回报文参考：
            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisPartTrans>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisPartTrans()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 审核配件申请 FOP_PUSH_FIS_AUDIT_PART
        /// 此接口按照顺丰开放平台标准对接，对接方式请查看【https://open.sf-express.com/developSupport/976720?activeIndex=802125】
        /// 此接口为检修单师傅发起自购配件申请时，商家对师傅申请的审核结果
        /// Service Code： FOP_PUSH_FIS_AUDIT_PART
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisAuditPart PushFisAuditPart(string body, out RequestPushFisAuditPart msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            waybillNo	订单号	true	string	
            taskCode	任务编码	true	string	
            auditStatus	审核状态	true	int	AUDIT_PASSED：审核通过 AUDIT_REFUSED：审核拒绝
            isContinuedService	是否需要继续服务	false	int	如果师傅发起的是自购配件申请，且被商家拒绝时此字段有值，0表示不需要继续服务，关闭订单。 1表示需要继续服务，商家补发配件
            1返回参数
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到任务推送信息，否则系统自动重试10次。

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            标准报文参考：

            {

             "waybillNo": "SJA12615616",
             "taskCode": "448945",
             "auditStatus":"AUDIT_PASSED"
            }
            标准返回报文参考：
            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisAuditPart>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisAuditPart()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        #endregion 安装服务-供应商接入

        #region 安装服务-供应商自主报价

        /// <summary>
        /// 下单 FOP_PUSH_FIS_BID_ORDER
        /// 此接口按照顺丰开放平台标准对接，对接方式请查看【https://open.sf-express.com/developSupport/976720?activeIndex=802125】
        /// 此接口为检修单师傅发起自购配件申请时，商家对师傅申请的审核结果
        /// Service Code： FOP_PUSH_FIS_AUDIT_PART
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisBidOrder PushFisBidOrder(string body, out RequestPushFisBidOrder msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            orderNo	订单号	true	string	唯一
            orderSource	订单来源	false	string	如京东
            customOrderId	商家订单号	false	string	如京东订单号
            orderContact	下单联系人	false	string	
            orderContactPhone	下单联系人电话	false	string	客户联系不上时，师傅可联系下单人
            receiverName	客户姓名	true	string	
            serviceType	安装类型	true	int	1:上门安装 2：提货+安装 3：配送 4.维修
            receiverPhone	客户电话	true	string	支持隐私号格式，例：13544553321-1234或13255554412,1548
            receiverAddress	客户地址	true	string	
            receiverProvince	客户省	true	string	如广东省
            receiverCity	客户市	true	string	如深圳市
            receiverCounty	客户区	true	string	如南山区
            pickupPhone	提货电话	false	string	当serviceType =2 或者serviceType = 3时必传
            pickupAddress	提货地址	false	string	当serviceType =2 或者serviceType = 3时必传
            logisticsCompany	物流公司名称	false	string	
            logisticsNo	物流运单号	false	string	
            arriveStatus	到货状态，1：已到货 2：未到货	true	int	serviceType=1时，表示货物已到客户家。 serviceType=2时，表示货物已到提货地址。
            expectArriveTime	预计到货时间	false	string	如2021-09-01 10:30:00
            expectInstallTime	期望上门安装时间	false	string	如2021-09-01 10:30:00
            packageCount	货物件数	false	int	
            remark	备注	false	string	
            installTypes	要安装的品类	true	List<InstallTypeDto>	参见 InstallTypeDto
            addedServices	增值服务	false	List<AddedServiceDto>	参见 AddedServiceDto
            extendInfo	扩展字段	false	Map<String, String>	Key & Value数据对
            selectMasterId	指定师傅id	false	string	
            InstallTypeDto
            参数名称	参数说明	是否必有	数据类型	说明
            installTypeCode	安装品类编码	true	String	
            installTypeName	安装品类名	true	String	如柜子
            imageUrl	品类图片，多个用逗号分隔	false	String	
            videoUrl	安装视频，多个用逗号分隔	false	String	链接有效期1天，请供应商视情况转存到自己的存储空间
            installRemark	安装备注	false	string	
            count	数量	true	int	注意：此字段是安装品类的数量
            businessCode	行业编码	true	string	HY0001：家具 HY0003：卫浴
            businessName	行业名称	true	string	如：家具
            AddedServiceDto（详情见附录1）
            参数名称	参数说明	是否必有	数据类型	说明
            addedServiceName	增值服务名	true	String	
            addedServiceCode	增值服务代码	true	String	
            addedServicePrice	增值服务价格	false	double(20,2)	
            请求报文参考：


            返回参数
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到任务推送信息，否则系统自动重试10次。

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据，参考如下
            obj：

            属性名	参数类型	是否必传	描述
            supplierOrderNo	String	true	供应商系统订单号
            标准返回报文参考：

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":{
                "supplierOrderNo":"P15651023"  
              }
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";
            PushFisBidOrderObj obj = null;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisBidOrder>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                    obj = new PushFisBidOrderObj()
                    {
                        supplierOrderNo = ""
                    };
                    //供应商系统订单号 怎么获取？？
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisBidOrder()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage,
                obj = obj
            };
        }

        /// <summary>
        /// 关单 FOP_PUSH_FIS_BID_CLOSE_ORDER
        /// 此接口由顺丰发起，关闭下游供应商订单，此接口应在产生费用前调用，产生费用后使用退款接口
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_BID_CLOSE_ORDER
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisBidCloseOrder PushFisBidCloseOrder(string body, out RequestPushFisBidCloseOrder msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            orderNo	订单号	true	string	唯一
            返回参数
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到任务推送信息，否则系统自动重试10次。

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            标准返回报文参考：

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisBidCloseOrder>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisBidCloseOrder()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 回传报价
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="accessToken"></param>
        /// <returns></returns>
        public static JsonResult FisQuote(string partnerID, string checkword, MsgDataRequestFisQuote data, string accessToken = "")
        {
            /*	
            供应商师傅对订单进行报价后，通过此接口回传报价信息
            url：http://fapi.sit.sf-express.com/fopApiServices/access/enter
            Service Code： FOP_RECE_FIS_QUOTE

            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            orderNo	订单号	true	string	唯一
            masterName	师傅姓名	true	string	
            avatar	师傅头像	false	string	图片url
            offerPrice	报价金额	true	double(20,2)	最多两位小数
            masterId	师傅id	true	string	供应商师傅id,唯一
            goodRatePercent	好评率	false	string	取值0.1~100 ，如99.8，不带%
            negativeCommentCount	差评数	false	int	
            complaintCount	被投诉次数	false	int	
            coWorkTimes	合作次数	false	int	
            masterLatestGoodsCat	最近服务过的商品	false	string	
            r30dTradeComplete	近30天成交量	false	int	
            starsAvg	师傅综合评分	false	string	取值0.1~5，如4.5
            certifyAmount	师傅缴纳的保证金金额	false	double(20,2)	
            返回参数
            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            标准返回报文参考：

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_QUOTE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSit(content);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisQuote>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 雇佣师傅 FOP_PUSH_FIS_HIRE_MASTER
        /// 供应商师傅报价后，顺丰调用此接口进行选择师傅
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_HIRE_MASTER
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisHireMaster PushFisHireMaster(string body, out RequestPushFisHireMaster msgData)
        {
            /*
            接口说明：
            供应商师傅报价后，顺丰调用此接口进行选择师傅

            url：由供应商提供

            Service Code： FOP_PUSH_FIS_HIRE_MASTER

            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            orderNo	订单号	true	string	
            masterId	师傅id	true	string	回传报价接口中的masterId
            offerPrice	师傅报价	true	double(20,2)	回传报价接口中的offerPrice
            返回参数
            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码，供应商返回以下错误代码，顺丰认为雇佣失败，其他的错误码顺丰默认雇佣成功。 320039：师傅暂停接单
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据，参考如下
            obj：

            属性名	参数类型	是否必传	描述
            installConcat	String	true	雇佣师傅的联系方式
            emergContactPhone	String	false	师傅的紧急联系电话
            标准返回报文参考：

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":{
                "installConcat":"15444444444",
                "emergContactPhone":"15555555555"
              }
            }
            失败返回报文参考：

            {
            "success":false,
            "errorCode":"320039",
            "errorMessage":"师傅暂停接单",
            "obj":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";
            PushFisHireMasterObj obj = null;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisHireMaster>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                    obj = new PushFisHireMasterObj()
                    {
                        installConcat = "",
                        emergContactPhone = ""
                    };
                    //怎么回传这两个值？？？
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisHireMaster()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage,
                obj = obj
            };
        }

        /// <summary>
        /// 推送到货信息 FOP_PUSH_FIS_BID_DELIVERY_NOTICE
        /// 此接口为推送到货通知接口。对于不同的业务，有可能在不同的节点推送到货：
        /// 货物到指定位置，可以前往提货并安装，此操作对应提货+安装业务。
        /// 货物已送到客户家，可以前往安装。
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_BID_DELIVERY_NOTICE
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisBidDeliveryNotice PushFisBidDeliveryNotice(string body, out RequestPushFisBidDeliveryNotice msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            orderNo	订单号	true	string	
            time	到货时间	true	string	格式为：yyyy-MM-hh HH:mm:ss
            serviceType	服务类型	true	int	1:上门安装 2：提货+安装
            pickupPhone	提货联系电话	false	String	电话有可能是手机或固定电话，不能保证格式统一
            pickupContact	提货联系人	false	string	
            pickupAddress	提货地址	false	String	
            pickupCode	提货码	false	string	预留字段
            receiveContact	收件人	true	string	
            receivePhone	收件联系人电话	true	string	
            receiveProvince	收件人省	true	string	
            receiveCity	收件人市	true	string	
            receiveCounty	收件人区	true	string	
            receiveAddress	收件人详细地址	true	string	
            parcelQuantity	包裹数量	true	int	
            请求报文参考：


            返回参数
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到任务推送信息，否则系统自动重试10次。

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            标准返回报文参考：

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisBidDeliveryNotice>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisBidDeliveryNotice()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 操作节点回传接口 
        /// 此接口为供应商提货、完工、分配师傅、预约、等操作信息回传接口。
        /// url：http://fapi.sit.sf-express.com/fopApiServices/access/enter
        /// Service Code：FOP_RECE_FIS_BID_OPEARTION_UPLOAD
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static JsonResult FisBidOpeartionUpload(string partnerID, string checkword, MsgDataRequestFisBidOpeartionUpload data, string accessToken = "")
        {
            /*	
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            content	操作描述	true	string	所有操作必须有此字段，格式可按下面说明进行编写
            operateCode	操作码	true	integer	OP000006：已分配师傅 OP000004：已预约 OP000000：提货 OP000007：上门打卡 OP000008：装前检查 OP000001：已完工 OP000010：好评返现 OP000011：验收 OP000013：关闭
            operateTime	操作时间	true	string	格式yyyy-MM-dd HH:mm:ss
            operateData	操作数据	false	Map<String,String>	不同操作码有不同数据，具体见下面文档
            operateData字段定义：

            操作码：OP000006（分配师傅）

            参数名称	参数说明	是否必须	数据类型	说明
            installMaster	安装师傅姓名	true	string	
            installConcat	安装师傅联系方式	true	string	
            emergContactPhone	师傅联系电话	false	string	
            操作码：OP000004（预约、异常预约）

            参数名称	参数说明	是否必须	数据类型	说明
            appTime	预约时间	true	string	格式”yyyy-MM-dd HH:mm:ss “，预约操作时此字段必填
            functionFlag	功能标志	false	int	0.正常预约 1.异常预约
            remark	异常预约原因	false	string	functionFlag=1时必填
            operateCode=OP000008

            参数名称	参数说明	是否必填	数据类型	说明
            imgUrl	装前检测图地址，多个逗号分割	true	String	
            operateCode=OP000001（完工）

            参数名称	参数说明	是否必填	数据类型	说明
            imgUrl	完工图地址，多个逗号分割	true	String	
            orderOriAmt	订单原始金额（优惠前）	false	double	
            orderDiscountAmt	订单优惠金额	false	double	
            orderRealAmt	订单实际支付金额（优惠后）	false	double	
            operateCode=OP000010（好评返现）

            参数名称	参数说明	是否必填	数据类型	说明
            imgUrl	好评返现图地址，多个逗号分割	true	String	
            operateCode=OP000011（验收）

            参数名称	参数说明	是否必填	数据类型	说明
            orderOriAmt	订单原始金额（优惠前）	false	double	
            orderDiscountAmt	订单优惠金额	false	double	
            orderRealAmt	订单实际支付金额（优惠后）	false	double	
            operateCode=OP000013（关闭）

            参数名称	参数说明	是否必填	数据类型	说明
            closeReason	订单关闭原因	true	String	
            orderOriAmt	订单原始金额（优惠前）	false	double	
            orderDiscountAmt	订单优惠金额	false	double	
            orderRealAmt	订单实际支付金额（优惠后）	false	double	
            请求报文参考：


            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_BID_OPEARTION_UPLOAD";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSit(content);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisBidOpeartionUpload>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /*
        增值服务审核  FOP_PUSH_FIS_AUDIT_COMMENT
        同 安装服务-供应商接入 中的  增值服务审核
        */

        /*
        推送期望服务时间  FOP_PUSH_FIS_EXPEDITE_INSTALL_NOTICE
        同 安装服务-供应商接入 中的  推送期望服务时间
        */

        /// <summary>
        /// 查询服务确认码 FOP_PUSH_FIS_QUERY_CONFIRM_CODE
        /// 此接口由供应商提供，若师傅操作打卡/完工时需要确认码，供应商通过此接口回传确认码
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_QUERY_CONFIRM_CODE
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisQueryConfirmCode PushFisQueryConfirmCode(string body, out RequestPushFisQueryConfirmCode msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            type	确认码类型	true	string	0: 打卡码 1：确认码
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	描述如下
            obj：

            属性名	参数类型	是否必传	描述
            confirmCode	String	N	打卡码/确认码
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":{
               "confirmCode":"1234" 
             }
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";
            PushFisQueryConfirmCodeObj obj = null;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisQueryConfirmCode>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                    obj = new PushFisQueryConfirmCodeObj()
                    {
                        confirmCode = ""
                    };
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisQueryConfirmCode()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage,
                obj = obj
            };
        }

        /// <summary>
        /// 催预约 FOP_PUSH_FIS_URGE_APPT
        /// 此接口用于用户催师傅与客户进行预约。
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_URGE_APPT
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisUrgeAppt PushFisUrgeAppt(string body, out RequestPushFisUrgeAppt msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必有	数据类型	说明
            orderNo	订单号	true	string	订单号
            opTime	操作时间	true	string	格式为：yyyy-MM-hh HH:mm:ss
            请求报文参考：


            返回参数
            注意： 接收报文方应按照标准返回报文格式返回是否已接受到期望服务时间推送信息，否则系统自动重试10次。

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	返回数据
            标准返回报文参考：

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisUrgeAppt>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisUrgeAppt()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 申请增加费用接口 FOP_PUSH_FIS_BID_ADD_FEE
        /// 此接口顺丰调用供应商发起订单增加费用申请
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_BID_ADD_FEE
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisBidAddFee PushFisBidAddFee(string body, out RequestPushFisBidAddFee msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            addFeeNo	增加费用流水号	true	string	唯一,用于区分多次增加费用记录
            functionFlag	功能标志	true	string	0.申请增加费用 1.取消增加费用
            addAmt	增加费用金额	true	double(20,2)	单位元，保留2位小数
            remark	增加费用原因	false	String	
            imgUrl	增加费用图片地址，多个逗号分割	false	String	
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码 A0001：流水号重复 A0002：订单已完成，不可增加费用 A0003：未雇佣师傅，不可增加费用 A0004：订单已关闭，不可增加费用 A0005：增加费用已处理，不可取消 A0006：其他错误
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	如下
            obj：

            属性名	参数类型	是否必传	描述
            outAddFeeNo	String	false	供应商系统增加费用流水号，推荐回传方便对账
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":{
                "outAddFeeNo":"A1234648631"
              }
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";
            PushFisBidAddFeeObj obj = null;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisBidAddFee>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                    obj = new PushFisBidAddFeeObj()
                    {
                        outAddFeeNo = ""
                    };
                    // 供应商系统增加费用流水号，推荐回传方便对账 这个需要
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisBidAddFee()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage,
                obj = obj
            };
        }

        /// <summary>
        /// 增加费用结果回传 
        /// 此接口由供应商回传增加费用处理结果给顺丰
        /// url：http://fapi.sit.sf-express.com/fopApiServices/access/enter
        /// Service Code：FOP_RECE_FIS_BID_ADD_FEE_RESULT
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FisBidAddFeeResult(string partnerID, string checkword, MsgDataRequestFisBidAddFeeResult data, string accessToken = "")
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            addFeeNo	增加费用流水号	true	string	用于区分多次增加费用记录
            detailResult	处理结果	true	string	1.师傅同意 2.师傅拒绝
            remark	拒绝原因	false	string	detailResult=2时 必填
            addAmt	增加费用金额	true	double(20,2)	单位元，保留两位小数,必须和申请增加费用接口金额保持一致
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_BID_ADD_FEE_RESULT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSit(content);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisBidAddFeeResult>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 增加费用结果查询 FOP_PUSH_FIS_BID_ADD_FEE_QUERY
        /// 此接口由顺丰调用供应商查询增加结果，当增加费用结果回传接口异常时，此接口作为兜底方案
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_BID_ADD_FEE_QUERY
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisBidAddFeeQuery PushFisBidAddFeeQuery(string body, out RequestPushFisBidAddFeeQuery msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            addFeeNo	增加费用流水号	true	string	用于区分多次增加费用记录
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	如下
            obj：

            属性名	参数类型	描述
            detailResult	String	处理结果 0.待处理 1.师傅同意 2.师傅拒绝
            remark	String	拒绝原因 detailResult=2时 必填
            addAmt	double(20,2)	增加费用金额 单位元，保留两位小数,必须和申请增加费用接口金额保持一致
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":{
                "detailResult":"2",
                "remark":"师傅拒绝增加费用",
                "refundAmt": 56.78
              }
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";
            PushFisBidAddFeeQueryObj obj = null;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisBidAddFeeQuery>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                    obj = new PushFisBidAddFeeQueryObj()
                    {
                        detailResult = "",
                        remark = "",
                        addAmt = 0
                    };
                    // 供应商系统增加费用流水号，推荐回传方便对账 这个需要
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisBidAddFeeQuery()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage,
                obj = obj
            };
        }

        /// <summary>
        /// 供应商侧发起增加费用 
        /// 此接口由供应商发起，师傅服务过程中，若需增加订单费用（商品费等），协商达成一致后师傅申请增加费用
        /// url：http://fapi.sit.sf-express.com/fopApiServices/access/enter
        /// Service Code：FOP_RECE_FIS_SUP_ADD_FEE
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FisSupAddFee(string partnerID, string checkword, MsgDataRequestFisSupAddFee data, string accessToken = "")
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            addFeeNo	增加费用流水号	true	string	唯一,用于区分多次增加费用记录
            functionFlag	功能标志	true	string	0.申请增加费用 1.取消增加费用
            addAmt	增加费用金额	true	double(20,2)	单位元，保留2位小数
            remark	增加费用原因	false	String	
            imgUrl	增加费用图片地址，多个逗号分割	false	String	
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码 A0001：流水号重复 A0002：订单已完成，不可增加费用 A0003：未雇佣师傅，不可增加费用 A0004：订单已关闭，不可增加费用 A0005：增加费用已处理，不可取消 A0006: 有待审核的增加费用流程，请等待用户审核后再发起新的增加费用流程 A0007：其他错误
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	如下
            obj：

            属性名	参数类型	是否必传	描述
            sfAddFeeNo	String	false	顺丰系统增加费用流水号，推荐保存方便对账
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":{
                "sfAddFeeNo":"12345648798461"
              }
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_SUP_ADD_FEE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSit(content);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisSupAddFee>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 供应商增加费用结果回传 FOP_PUSH_FIS_SUP_ADD_FEE_RESULT
        /// 此接口由顺丰回传增加费用审核结果给供应商
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_SUP_ADD_FEE_RESULT
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisBidAddFeeQuery PushFisSupAddFeeResult(string body, out RequestPushFisSupAddFeeResult msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            addFeeNo	增加费用流水号	true	string	用于区分多次增加费用记录
            detailResult	处理结果	true	string	1.用户同意 2.用户拒绝
            remark	拒绝原因	false	string	detailResult=2时 必填
            addAmt	增加费用金额	true	double(20,2)	单位元，保留两位小数,必须和供应商申请增加费用接口金额保持一致
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisSupAddFeeResult>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisBidAddFeeQuery()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 供应商增加费用结果查询 
        /// 此接口由供应商调用顺丰查询增加费用结果，当供应商增加费用结果回传接口异常时，此接口作为兜底方案
        /// url：http://fapi.sit.sf-express.com/fopApiServices/access/enter
        /// Service Code：FOP_RECE_FIS_SUP_ADD_FEE_QUERY
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FisSupAddFeeQuery(string partnerID, string checkword, MsgDataRequestFisSupAddFeeQuery data, string accessToken = "")
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            addFeeNo	增加费用流水号	true	string	用于区分多次增加费用记录
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	如下
            obj：

            属性名	参数类型	是否必传	描述
            detailResult	String	Y	处理结果 0.待处理 1.用户同意 2.用户拒绝 3.师傅取消
            remark	String	N	拒绝原因 detailResult=2时 必填
            addAmt	double(20,2)	Y	增加费用金额 单位元，保留两位小数,必须和供应商申请增加费用接口金额保持一致
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":{
                "detailResult":"2",
                "remark":"用户拒绝增加费用",
                "refundAmt": 56.78
              }
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_SUP_ADD_FEE_QUERY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSit(content);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisSupAddFeeQuery>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 申请退款接口 FOP_PUSH_FIS_BID_REFUND
        ///  此接口顺丰调用供应商发起订单退款申请
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_BID_REFUND
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisBidRefund PushFisBidRefund(string body, out RequestPushFisBidRefund msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            refundNo	退款流水号	true	string	唯一,用于区分多次退款记录
            reasonType	退款原因类型	true	string	1.预约时间冲突，师傅无法服务 2.师傅拒绝服务 3.师傅不会安装 4.师傅工具/配件不齐全导致无法安装 5.联系不上师傅 6.其他
            otherReason	退款原因说明	false	string	当reasonType=6时，这里填具体原因
            refundAmt	退款金额	true	double(20,2)	申请退款的金额，单位元，保留两位小数
            refundType	退款类型	true	int	0:全额退款 1:部分退款
            functionFlag	功能标志	true	int	0.申请退款 1.取消退款申请
            orderFlag	订单标志	true	int	0:退款完成后关闭订单 1:退款完成后继续服务
            imgUrl	申请退款图片地址，多个逗号分割	false	String	
            请求报文示例-申请退款：

            {
              "orderNo": "SJA100100204713_448421",
              "refundNo": "11299741538535681",
              "reasonType": "6",
              "otherReason": "客户申请退款",
              "refundAmt": "30",
              "refundType": 1,
              "functionFlag": 0,
              "orderFlag": 1,
              "imgUrl": ""
            }
            请求报文示例-取消退款申请：

            {
              "orderNo": "SJA100100204713_448421",
              "refundNo": "11299741538535681",
              "functionFlag": 1
            }
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码 R0001：流水号重复 R0002：订单已完成，不可申请退款 R0003：未雇佣师傅，不可申请退款 R0004：订单已关闭，不可申请退款 R0005：申请退款金额超过可退款金额 R0006：申请退款次数已达到最大限制 R0007：当前订单状态不可发起全部退款 R0008：申请退款已处理，不可取消 R0009：其他错误
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	如下
            obj：

            属性名	参数类型	是否必传	描述
            outRefundNo	String	false	供应商系统退款流水号，推荐回传方便对账
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":{
                "outRefundNo":"R1234648631"
              }
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";
            PushFisBidRefundObj obj = null;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisBidRefund>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                    obj = new PushFisBidRefundObj()
                    {
                        outRefundNo = ""
                    };
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisBidRefund()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage,
                obj = obj
            };
        }

        /// <summary>
        /// 退款结果回传 
        /// 此接口由供应商回传退款处理结果给顺丰
        /// url：http://fapi.sit.sf-express.com/fopApiServices/access/enter
        /// Service Code：FOP_RECE_FIS_BID_REFUND_RESULT
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FisBidRefundResult(string partnerID, string checkword, MsgDataRequestFisBidRefundResult data, string accessToken = "")
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            refundNo	退款流水号	true	string	发起退款申请时的流水号
            refundStatus	退款状态	true	string	0.师傅同意 1.师傅拒绝
            remark	备注	false	string	当refundStatus=1时，返回拒绝原因
            refundAmt	退款金额	true	double(20,2)	单位元，保留两位小数。 必须和申请退款接口的金额保持一致
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_BID_REFUND_RESULT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSit(content);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisBidRefundResult>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 退款结果查询 FOP_PUSH_FIS_BID_REFUND_QUERY
        /// 此接口由顺丰调用供应商查询退款结果，当退款结果回传接口异常时，此接口作为兜底方案
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_BID_REFUND_QUERY
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisBidRefundQuery PushFisBidRefundQuery(string body, out RequestPushFisBidRefundQuery msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            refundNo	退款流水号	true	string	发起退款申请时的流水号
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            obj	Object	N	如下
            obj：

            属性名	参数类型	是否必传	描述
            refundStatus	String	true	退款状态 0.师傅同意 1.师傅拒绝 2.处理中
            remark	String	false	当refundStatus=1时，返回拒绝原因
            refundAmt	double(20,2)	true	申请退款的金额，单位元，保留两位小数 必须和申请退款接口的金额保持一致
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null,
            "obj":{
                "refundStatus":"1",
                "remark":"师傅拒绝退款",
                "refundAmt": 56.78
              }
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";
            PushFisBidRefundQueryObj obj = null;

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisBidRefundQuery>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                    obj = new PushFisBidRefundQueryObj()
                    {
                        refundStatus = "0",
                        remark = "",
                        refundAmt = 0
                    };
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisBidRefundQuery()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage,
                obj = obj
            };
        }

        /// <summary>
        /// 投诉师傅 FOP_PUSH_FIS_COMPLAINT
        /// 此接口由供应商提供，当师傅服务质量出现问题时，客户调用此接口发起投诉
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_COMPLAINT
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisComplaint PushFisComplaint(string body, out RequestPushFisComplaint msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            functionFlag	功能标志位	true	int	0：发起投诉 1：取消投诉
            complaintType	投诉类型	true	string	见附录2
            complaintDesc	投诉描述	false	string	客户自己填写的描述
            evidenceUrls	投诉图片链接，多个用逗号分隔	false	string	
            audioUrls	投诉音频链接，多个用逗号分隔	false	string	音频链接，链接有效期1天，请供应商视情况转存到自己的存储空间
            videoUrls	投诉视频链接，多个用逗号分隔	false	string	视频链接，链接有效期1天，请供应商视情况转存到自己的存储空间
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisComplaint>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisComplaint()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 接收投诉结果 
        /// 此接口由顺丰提供，接收投诉返回结果
        /// url：http://fapi.sit.sf-express.com/fopApiServices/access/enter
        /// Service Code：FOP_RECE_FIS_COMPLAINT_RESULT
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FisComplaintResult(string partnerID, string checkword, MsgDataRequestFisComplaintResult data, string accessToken = "")
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            handleResult	处理结果	true	int	处理结果1.成立 2.不成立
            payAmt	赔偿金额	false	string	单位元
            evidenceUrls	处理凭证url，多个用逗号分隔	false	string	
            handleTime	处理时间	false	string	格式yyyy-MM-dd HH:mm
            handleDesc	处理结果说明	false	string	长度不超过1024
            isOnlineRefund	是否线上退款	false	int	0：否，1：是，默认0
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_COMPLAINT_RESULT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSit(content);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisComplaintResult>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 通知用户补充举证 
        /// 此接口由顺丰提供，当供应商客服处理投诉时，如果需要用户补充举证来帮助判定投诉结果，调用此接口通知用户补充举证
        /// url：http://fapi.sit.sf-express.com/fopApiServices/access/enter
        /// Service Code：FOP_RECE_FIS_COMPLAINT_SUPPLY_NOTICE
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FisComplaintSupplyNotice(string partnerID, string checkword, MsgDataRequestFisComplaintSupplyNotice data, string accessToken = "")
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            noticeTime	通知时间	false	string	格式：yyyy-MM-dd HH:mm:ss, 客服操作时间，不传默认为当前时间
            expireTime	补充举证截止时间	false	string	格式：yyyy-MM-dd HH:mm:ss,若不传，默认通知时间+12小时
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_COMPLAINT_SUPPLY_NOTICE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSit(content);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisComplaintSupplyNotice>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 用户补充举证 FOP_PUSH_FIS_COMPLAINT_USER_SUPPLY
        /// 此接口由供应商提供，当用户收到通知补充举证信息时，调用此接口进行补充举证
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_COMPLAINT_USER_SUPPLY
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisComplaintUserSupply PushFisComplaintUserSupply(string body, out RequestPushFisComplaintUserSupply msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            supplyId	用户补充举证id	true	string	用于区分用户多次补充举证，或用于去重
            supplyTime	用户补充举证的时间	true	string	格式：yyyy-MM-dd HH:mm:ss
            complaintDesc	举证内容	true	string	
            evidenceUrls	举证图片链接，多个用逗号分隔	false	string	
            audioUrls	举证音频链接，多个用逗号分隔	false	string	音频链接，链接有效期1天，请供应商视情况转存到自己的存储空间
            videoUrls	举证视频链接，多个用逗号分隔	false	string	视频链接，链接有效期1天，请供应商视情况转存到自己的存储空间
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisComplaintUserSupply>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisComplaintUserSupply()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        /// <summary>
        /// 师傅举证回传 
        /// 此接口由顺丰提供，当师傅对投诉进行举证时，需要调用此接口回传给用户展示。
        /// url：http://fapi.sit.sf-express.com/fopApiServices/access/enter
        /// Service Code：FOP_RECE_FIS_COMPLAINT_MASTER_EVIDENCE
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult FisComplaintMasterEvidence(string partnerID, string checkword, MsgDataRequestFisComplaintMasterEvidence data, string accessToken = "")
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            supplyId	师傅补充举证id	true	string	用于区分师傅多次补充举证，或用于去重
            supplyTime	师傅补充举证的时间	true	string	格式：yyyy-MM-dd HH:mm:ss
            complaintDesc	举证内容	false	string	
            evidenceUrls	举证图片链接，多个用逗号分隔	false	string	
            audioUrls	举证音频链接，多个用逗号分隔	false	string	
            videoUrls	举证视频链接，多个用逗号分隔	false	string	
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_FIS_COMPLAINT_MASTER_EVIDENCE";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseSit(content);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseFisComplaintMasterEvidence>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 更新投诉退款线上账户 FOP_PUSH_FIS_COMPLAINT_REFUND_ACCOUNT_INFO
        /// 此接口由供应商提供，当投诉成立赔偿金额大于0并且供应商支持上线退款时，用户可以通过此接口将用户账户信息通知供应商
        /// url：由供应商提供
        /// Service Code： FOP_PUSH_FIS_COMPLAINT_REFUND_ACCOUNT_INFO
        /// </summary>
        /// <param name="body"></param>
        /// <param name="msgData">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushFisComplaintRefundAccountInfo PushFisComplaintRefundAccountInfo(string body, out RequestPushFisComplaintRefundAccountInfo msgData)
        {
            /*
            接口参数
            参数名称	参数说明	是否必须	数据类型	说明
            orderNo	订单号	true	string	
            payChannel	赔付渠道	true	string	bank：银行卡，wechat：微信，ali：支付宝
            bankName	开户行名称	true	string	
            bankCode	开户行编码	true	string	
            bankCard	银行卡号	true	string	长度不得超过20
            accountName	开户人姓名	true	string	长度不得超过20
            返回参数

            属性名	参数类型	是否必传	描述
            errorCode	String	N	错误代码
            errorMessage	String	N	错误描述
            success	Boolean	Y	是否成功
            返回示例

            {
            "success":true,
            "errorCode":null,
            "errorMessage":null
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMessage = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<RequestPushFisComplaintRefundAccountInfo>(body);
                if (reqData != null)
                {
                    msgData = reqData;
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushFisComplaintRefundAccountInfo()
            {
                success = success,
                errorCode = errorCode,
                errorMessage = errorMessage
            };
        }

        #endregion 安装服务-供应商自主报价

        #region 工单类

        /// <summary>
        /// 外部客户或供应商上报工单
        /// 客户/供应商调用此接口，可向指定的顺丰单号发起工单
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QcsWorkOrderReport(string partnerID, string checkword, MsgDataRequestQcsWorkOrderReport data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            1.3 请求参数<msgData>
            1.3.1 元素<请求> msgData
            序号	属性名	类型(约束)	必填	描述
            1	orderNo	String	是	顺丰单号
            2	creator	String	是	上报人
            3	creatorPhone	String	否	上报人联系方式
            4	bussCategory	int	是	业务类型（0-顺丰家装业务），目前固定传0
            5	orderCategoryOne	String	是	一级声音
            6	orderCategoryTwo	String	是	二级声音
            7	orderCategoryThree	String	否	三级声音
            8	urgencyDegree	int	是	紧急程度（1-普通，2-紧急）
            9	reportContent	String	是	工单上报内容
            10	pics	String	否	图片url，逗号分隔，最多6张，单张图片不超过10M
            11	afterHandleReplyTime	int	否	工单处理时效要求，单位：分钟
            12	reportSourceNo	String	是	第三方工单唯一编码(用于后续部分接口交互)
            1.3.2 请求示例
            请求报文:（msgData字段）:

            {
              "orderNo": "SF123132546456",
              "creator": "小李",
              "creatorPhone": "13322222222",
              "bussCategory": 0,
              "orderCategoryOne": "预约异常",
              "orderCategoryTwo": "客户电话错误",
              "orderCategoryThree": "",
              "urgencyDegree": 1,
              "reportContent": "客户电话无法联系上，请协助解决",
              "pics": "https://www.baidu.com,https://www.sf-express.com",
              "afterHandleReplyTime": "120",
              "reportSourceNo": "BDSFNRJKGTBWQE123628746785"
            }
            1.4 公共响应参数
            #	属性名	类型(约束)	必填	描述
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	是	业务处理详细结果
            1.4.1 元素<响应> apiResultData
            #	属性名	类型(约束)	必填	描述
            1	success	String	是	true 请求成功，false 请求失败
            2	errorCode	String	否	错误编码，success = false时返回
            3	errorMessage	String	否	错误描述 , success = false时返回
            4	obj	Object	是	返回的详细数据
            1.4.2 元素<响应> obj
            #	属性名	类型(约束)	必填	描述
            1	workOrderId	String	是	顺丰工单id
            1.4.3 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "0001727E2494543FEA449BF48D24123F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "errorCode": null,
                    "errorMsg": null,
                    "obj": {
                        "workOrderId": "489461"
                    }
                }
            }
            失败响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "0001727E2494543FEA449BF48D24123F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "10003",
                    "errorMsg": "未查询到运单号信息"
                }
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_QCS_WORK_ORDER_REPORT";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseQcsWorkOrderReport>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        resultdata = JsonHelper.SerializeObject(msgDataResponse.obj);
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 外部客户或供应商回复工单
        /// 客户/供应商调用此接口，进行工单回复
        /// </summary>
        /// <param name="partnerID"></param>
        /// <param name="checkword"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <param name="environment">调用环境，bspgw：生产环境；sfapi-hk：香港生产环境；sfapi-sbox：沙箱环境</param>
        /// <returns></returns>
        public static JsonResult QcsWorkOrderReply(string partnerID, string checkword, MsgDataRequestQcsWorkOrderReply data, string accessToken = "", string environment = "bspgw")
        {
            /*	
            1.2.3. 请求参数<msgData>
            1.2.4 元素<请求> msgData
            序号	属性名	类型(约束)	必填	描述
            1	workOrderId	String	条件	顺丰工单id，workOrderId和reportSourceNo至少传一个
            2	reportSourceNo	String	条件	第三方工单唯一编码，取【外部客户/供应商上报工单】接口reportSourceNo字段，workOrderId和reportSourceNo至少传一个
            3	replyId	String	是	回复唯一ID,用于去重校验
            4	replyContent	String	是	回复内容
            5	replyName	String	是	回复人名称
            6	replyPhone	String	否	回复人联系方式
            7	pics	String	否	图片url，逗号分隔，最多6张，单张图片不超过10M
            8	isDone	int	是	是否完结工单 0否 1是，传1时，代表本条工单完结。
            9	isSolve	int	否	是否解决 0否 1是
            1.2.4 请求示例
            请求报文:（msgData字段）:

            {
              "replyName": "小李",
              "replyPhone": "13355552222",
              "replyId":"sdnejjriewotji5oyjtioy",
              "workOrderId": "185944",
              "reportSourceNo": "BUEGYU123353456",
              "replyContent": "这是一条回复内容",
              "pics": "https://www.baidu.com,https://www.sf-express.com",
              "isDone": 0
            }
            1.3. 公共响应参数
            #	属性名	类型(约束)	必填	描述
            1	apiResultCode	String(10)	是	API平台结果代码
            2	apiErrorMsg	String(200)	否	API平台异常信息
            3	apiResponseID	String(40)	是	API响应唯一号UUID
            4	apiResultData	String	是	业务处理详细结果
            2.3.1 元素<响应> apiResultData
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	true 请求成功，false 请求失败
            2	errorCode	String	否	错误编码，success = false时返回
            3	errorMessage	String	否	错误描述 , success = false时返回
            1.3.2 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                "apiErrorMsg": "",
                "apiResponseID": "0001727E2494543FEA449BF48D24123F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": true,
                    "errorCode": null,
                    "errorMsg": null
                }
            }
            失败响应：
            {
                "apiErrorMsg": "",
                "apiResponseID": "0001727E2494543FEA449BF48D24123F",
                "apiResultCode": "A1000",
                "apiResultData": {
                    "success": false,
                    "errorCode": "10003",
                    "errorMsg": "未查询到运单号信息"
                }
            }
            */
            string errcode = "";
            string errmsg = "";
            string resultdata = "";

            string serviceCode = "FOP_RECE_QCS_WORK_ORDER_REPLY";
            string msgData = SFCommon.JsonCompress(JsonHelper.SerializeObject(data));
            string timestamp = SFCommon.GetTimeStamp(); //获取时间戳
            string requestID = Guid.NewGuid().ToString(); //获取uuid

            Dictionary<string, string> content = new Dictionary<string, string>();
            content["partnerID"] = partnerID;
            content["requestID"] = requestID;
            content["serviceCode"] = serviceCode;
            content["timestamp"] = timestamp;
            if (!string.IsNullOrWhiteSpace(accessToken))
            {
                content["accessToken"] = accessToken;
            }
            else
            {
                string msgDigest = SFCommon.MD5ToBase64String(SFCommon.UrlEncode(msgData + timestamp + checkword));
                content["msgDigest"] = msgDigest;
            }
            content["msgData"] = msgData;

            var result = HttpHelper.GetResponseApiResultData(content, null, environment);
            if (result != null)
            {
                if (result.apiResultCode == "A1000")
                {
                    var msgDataResponse = JsonHelper.DeserializeObject<MsgDataResponseQcsWorkOrderReply>(result.apiResultData);
                    if (msgDataResponse != null)
                    {
                        errmsg = msgDataResponse.errorMessage;
                        if (msgDataResponse.success)
                        {
                            errcode = "0";
                        }
                        else
                        {
                            errcode = msgDataResponse.errorCode;
                        }
                    }
                    else
                    {
                        errcode = "-2";
                        errmsg = "未返回业务数据";
                        resultdata = "";
                    }
                }
                else
                {
                    errcode = result.apiResultCode;
                    errmsg = result.apiErrorMsg;
                    resultdata = result.apiResultData;
                }
            }
            else
            {
                errcode = "-1";
                errmsg = "接口未返回内容";
                resultdata = "";
            }

            return new JsonResult
            {
                errcode = errcode,
                errmsg = errmsg,
                data = resultdata
            };
        }

        /// <summary>
        /// 顺丰工单同步外部客户或供应商 FOP_PUSH_QCS_WORK_ORDER_REPORT
        /// 顺丰客服在顺丰工单系统主动发起工单时，调用此接口将工单信息同步给客户/供应商
        /// </summary>
        /// <param name="body"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushQcsWorkOrderReport PushQcsWorkOrderReport(string body, out MsgDataRequestPushQcsWorkOrderReport msgData)
        {
            /*	
            1.2. 接口定义
            1.2.1. 公共参数
            名称	值
            接口服务代码	FOP_PUSH_QCS_WORK_ORDER_REPORT
            批量交易	不支持
            接口类型	推送(SF–>客户)
            报文类型	JSON
            1.2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	requestID	String(40)	是	请求唯一号UUID
            2	serviceCode	String(50)	是	接口服务代码
            3	timestamp	long	是	调用接口时间戳
            4	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填，不可与accessToken字段同时传参 签名方法参考：数字签名认证说明
            5	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填，不可与msgDigest同时传参 获取方法参考：OAuth2认证说明
            6	msgData	String	是	业务数据报文
            1.2.3. 请求参数<msgData>
            1.2.4 元素<请求> msgData
            序号	属性名	类型(约束)	必填	描述
            1	orderNo	String	是	顺丰单号
            2	workOrderId	String	是	顺丰工单id
            2	creator	String	是	上报人
            3	creatorPhone	String	否	上报人联系方式
            4	bussCategory	int	是	业务类型（0-顺丰家装业务），目前固定传0
            5	orderCategoryOne	String	是	一级声音
            6	orderCategoryTwo	String	是	二级声音
            7	orderCategoryThree	String	否	三级声音
            8	urgencyDegree	int	是	紧急程度（1-普通，2-紧急）
            9	reportContent	String	是	工单上报内容
            10	pics	String	否	图片url，逗号分隔，最多6张
            11	afterHandleReplyTime	int	否	工单处理时效要求，单位：分钟
            1.2.5 请求示例
            请求报文:（msgData字段）:

            {
              "orderNo": "SF123132546456",
              "workOrderId":"157896",
              "creator": "顺丰客服",
              "creatorPhone": "13322222222",
              "bussCategory": 0,
              "orderCategoryOne": "预约异常",
              "orderCategoryTwo": "客户电话错误",
              "orderCategoryThree": "",
              "urgencyDegree": 1,
              "reportContent": "客户电话无法联系上，请协助解决",
              "pics": "https://www.baidu.com,https://www.sf-express.com",
              "afterHandleReplyTime": "120"
            }
            1.3 响应参数，客户系统按此结构返回响应参数
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	true 请求成功，false 请求失败 ,false时顺丰侧会进行重试
            2	errorCode	String	否	错误编码，success = false时返回
            3	errorMessage	String	否	错误描述 , success = false时返回
            1.3.1 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                    "success": true,
                    "errorCode": null,
                    "errorMsg": null  
   
            }
            失败响应
            {
                    "success": false,
                    "errorCode": "客户定义",
                    "errorMsg": "客户定义"  
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMsg = "失败";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<PushQcsWorkOrderReportRequest>(body);
                if (reqData != null)
                {
                    msgData = JsonHelper.DeserializeObject<MsgDataRequestPushQcsWorkOrderReport>(reqData.msgData);
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushQcsWorkOrderReport()
            {
                success = success,
                errorCode = errorCode,
                errorMsg = errorMsg
            };
        }

        /// <summary>
        /// 顺丰客服回复工单同步外部客户或供应商 FOP_PUSH_QCS_WORK_ORDER_REPLY
        /// 顺丰客服在顺丰工单系统回复工单时（包括顺丰发起的工单和外部客户/供应商发起的工单），将回复内容同步给外部客户/供应商
        /// </summary>
        /// <param name="body"></param>
        /// <param name="data">业务数据报文 json字符串</param>
        /// <returns></returns>
        public static ResponsePushQcsWorkOrderReply PushQcsWorkOrderReply(string body, out MsgDataRequestPushQcsWorkOrderReply msgData)
        {
            /*	
            1.2. 接口定义
            1.2.1. 公共参数
            名称	值
            接口服务代码	FOP_PUSH_QCS_WORK_ORDER_REPLY
            批量交易	不支持
            接口类型	推送(SF–>客户)
            报文类型	JSON
            1.2.2. 公共请求参数
            序号	参数列表	类型	是否必传	含义
            1	requestID	String(40)	是	请求唯一号UUID
            2	serviceCode	String(50)	是	接口服务代码
            3	timestamp	long	是	调用接口时间戳
            4	msgDigest	String(128)	条件	数字签名,使用数字签名方式认证时必填，不可与accessToken字段同时传参 签名方法参考：数字签名认证说明
            5	accessToken	String	条件	访问令牌，使用OAuth2方式认证时必填，不可与msgDigest同时传参 获取方法参考：OAuth2认证说明
            6	msgData	String	是	业务数据报文
            1.2.3. 请求参数<msgData>
            1.2.4 元素<请求> msgData
            序号	属性名	类型(约束)	必填	描述
            1	workOrderId	String	是	顺丰工单id
            2	reportSourceNo	String	否	第三方工单唯一编码，如果是外部客户/供应商发起的工单，此字段有值
            3	replyId	String	是	回复唯一ID,用于去重校验
            4	replyContent	String	是	回复内容
            5	replyName	String	是	回复人名称
            6	replyPhone	String	否	回复人联系方式
            7	pics	String	否	图片url，逗号分隔，最多6张
            8	isDone	int	是	是否完结工单 0否 1是，传1时，代表本条工单完结。
            9	isSolve	int	否	是否解决 0否 1是
            1.2.5 请求示例
            请求报文:（msgData字段）:

            {
              "replyName": "顺丰客服",
              "replyPhone": "13355552222",
              "replyId":"sdnejjriewotji5oyjtioy",
              "workOrderId": "185944",
              "reportSourceNo": "BUEGYU123353456",
              "replyContent": "顺丰客服的回复内容",
              "pics": "https://www.baidu.com,https://www.sf-express.com",
              "isDone": 0
            }
            1.3 响应参数，客户系统按此结构返回响应参数
            #	属性名	类型(约束)	必填	描述
            1	success	boolean	是	true 请求成功，false 请求失败 ,false时顺丰侧会进行重试
            2	errorCode	String	否	错误编码，success = false时返回
            3	errorMessage	String	否	错误描述 , success = false时返回
            1.3.1 返回示例\应用场景(JSON)示例
            响应报文:

            成功响应:
            {
                    "success": true,
                    "errorCode": null,
                    "errorMsg": null  
   
            }
            失败响应
            {
                    "success": false,
                    "errorCode": "客户定义",
                    "errorMsg": "客户定义"  
            }
            */
            bool success = false;
            string errorCode = "";
            string errorMsg = "";

            if (!string.IsNullOrEmpty(body))
            {
                var reqData = JsonHelper.DeserializeObject<PushQcsWorkOrderReplyRequest>(body);
                if (reqData != null)
                {
                    msgData = JsonHelper.DeserializeObject<MsgDataRequestPushQcsWorkOrderReply>(reqData.msgData);
                    success = true;
                }
                else
                {
                    msgData = null;
                }
            }
            else
            {
                msgData = null;
            }
            return new ResponsePushQcsWorkOrderReply()
            {
                success = success,
                errorCode = errorCode,
                errorMsg = errorMsg
            };
        }

        #endregion 工单类
    }
}
